แทนที่คำสั่ง LaTeX ที่ซ้อนกันด้วยหลายอาร์กิวเมนต์


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}

ไม่มีใครรู้วิธีบรรลุผลนี้


2
คุณอาจต้องการถาม tex.stackexchange.com - สิ่งนี้เกินความสามารถของการแสดงออกปกติ
glenn jackman

@glennjackman: นี่ไม่ใช่คำถาม TeX ฉันต้องการสคริปต์เพื่อแทนที่คำสั่งในไฟล์ทั้งหมดของฉัน
Simon Schälli

คำตอบ:


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 ถือรหัสที่จะต้องเปลี่ยน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.