Zamień zagnieżdżone polecenie LaTeX na wiele argumentów

2

Chciałbym zastąpić polecenie LaTeX \teilseiten{left col width}{left col text}{right col text}zagnieżdżonym środowiskiem. Problem polega na tym, że drugi i trzeci argument \teilseitenzawiera polecenia i / lub środowiska.

\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}
}

Należy zastąpić whith

\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}

Czy ktoś wie, jak to osiągnąć?

Simon Schälli
źródło
2
Możesz zapytać na tex.stackexchange.com - to z pewnością przekracza możliwości wyrażeń regularnych.
glenn jackman
@glennjackman: To nie jest pytanie TeX-a. Potrzebuję skryptu, aby zastąpić polecenie we wszystkich moich plikach.
Simon Schälli,

Odpowiedzi:

1

Zakładam, że masz dostępne standardowe środowisko * 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}/
}

Wklej skrypt do lanext.shpliku i skonfiguruj go jako:

chmod +x lanext.sh

Uruchom to w ten sposób:

./lanext.sh test.txt

Gdzie test.txtzawiera kod, który należy wymienić.

SΛLVΘ
źródło