2

Я бы хотел заменить команду LaTeX \teilseiten{left col width}{left col text}{right col text} вложенной средой. Проблема в том, что второй и третий аргумент \teilseiten содержит команды и / или среды.

\teilseiten{0.5}{
  Some text and \textbf{even}
  \begin{tiny}
     environments
  \end{tiny}
}{
  Some other text and \textbf{even}
  \begin{tiny}
    more environments
  \end{tiny}
}

Должен быть заменен ти

\begin{mycolumns}
  \begin{mycolumn}{0.5}
    Some text and \textbf{even}
    \begin{tiny}
       environments
    \end{tiny}
  \end{mycolumn}
  \begin{mycolumn}{0.5}
    Some other text and \textbf{even}
    \begin{tiny}
       more environments
    \end{tiny}
  \end{mycolumn}
\end{mycolumns}

Кто-нибудь знает, как этого добиться?

1 ответ1

1

Я предполагаю, что у вас есть стандартная среда * nix Bash.

#!/bin/sed -f

# Match pattern that begins ("^") with "\teil...", capture what's
# between braces thru parentheses.
/^\\teilseiten\({.*}\){/ {
# And...

    # Copy pattern on hold space ("h"); substitute pattern with new
    # lines, with captured text at the end, retrieved by backreference
    # ("\1"); process next line ("n").
    h; s//\\begin{mycolumns}\n  \\begin{mycolumn}\1/; n

    # Set a label.
    : loop

    # Add two spaces at the beginning of line ("^"); process next line 
    # ("n").
    s/^/  /; n

    # If line contains "\end{tiny}" add two spaces in front, a newline
    # ("\n") at the end of it ("&"), and the new line " \end{my...".
    s/.*\\end{tiny}/  &\n  \\end{mycolumn}/

    # If no substitution was succesful after last read line ("n")
    # (i.e. the "s" above wasn't triggered), jump to label.
    T loop

    # Process next line ("n"); if braces "}{" are at beginning of line
    # ("^"), then copy ("g") hold space to pattern space (see "h"
    # above); capture content between braces, substitute pattern with
    # line "\begin{my..." and captured string "\1" at the end.
    n; /^}{/ {
        g; s/.*\({.*}\){/\\begin{mycolumn}\1/
    }

    # If the above substitution was successful (i.e. "}{" was
    # matched), jump to label.
    t loop

    # Substitute brace with "\end{my...".
    s/^}$/\\end{mycolumns}/
}

Вставьте скрипт в файл lanext.sh и сделайте его исполняемым:

chmod +x lanext.sh

Запустите это так:

./lanext.sh test.txt

Где test.txt содержит код, который необходимо заменить.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .