Ich würde gerne ausgehend von diesem Beispiel

Öffne in Overleaf
\documentclass{minimal}
\usepackage{amsmath}
\usepackage{environ}

\makeatletter

\newcommand{\LinearSystems@SetupLets}{%
  \let\col=&%
  \let\+=+%
  \let\-=-%
  \let\===%
}
\newcommand{\LinearSystems@SetupCatcodes}{%
  \catcode`\&=\active
  \catcode`\+=\active
  \catcode`\-=\active
  \catcode`\==\active
}
\newcommand{\LinearSystems@Setup}{}
\begingroup
  \LinearSystems@SetupCatcodes
  \gdef\LinearSystems@Setup{%
    \LinearSystems@SetupLets
    \LinearSystems@SetupCatcodes
    \newcommand&[1][0pt]{\col\hspace{##1}\col}%
    \def+{\col\+{}{}\col}%
    \def-{\col\-{}{}\col}%
    \def={\col\={}{}\col}%
  }
\endgroup

\NewEnviron{LinearSystems}[1]{\begin{alignat*}{#1}\BODY\end{alignat*}}
\let\LinearSystems@OriginalBegin\LinearSystems
\def\LinearSystems{\LinearSystems@Setup\LinearSystems@OriginalBegin}

\makeatother

\begin{document}
  \begin{LinearSystems}{3}
    4x_1 + x_2 = 1\\
    \-x_1 + x_2 = \-2
  \end{LinearSystems}
\end{document}

zwei Varianten der Umgebung LinearSystems machen:

Öffne in Overleaf
\NewEnviron{LinearSystems}[1]{\begin{alignat}{#1}\BODY\end{alignat}}
\NewEnviron{LinearSystems*}[1]{\begin{alignat*}{#1}\BODY\end{alignat*}}

Wie kann ich das umsetzen?

gefragt 25 Jan '17, 10:05

tom75's gravatar image

tom75
2.1k4981
Akzeptiert: 88%

bearbeitet 25 Jan '17, 11:07

saputello's gravatar image

saputello
10.0k53458


Statt mit \let und Umschaufeln der Definition in eine interne Anweisung zu hantieren, empfehle ich die Verwendung des Paket xpatch zur Erweiterung der Definition von LinearSystems und LinearSystems*:

Öffne in Overleaf
\documentclass{article}
\usepackage{amsmath}
\usepackage{environ}
\usepackage{xpatch}

\makeatletter

\newcommand{\LinearSystems@SetupLets}{%
  \let\col=&%
  \let\+=+%
  \let\-=-%
  \let\===%
}
\newcommand{\LinearSystems@SetupCatcodes}{%
  \catcode`\&=\active
  \catcode`\+=\active
  \catcode`\-=\active
  \catcode`\==\active
}
\newcommand{\LinearSystems@Setup}{}
\begingroup
  \LinearSystems@SetupCatcodes
  \gdef\LinearSystems@Setup{%
    \LinearSystems@SetupLets
    \LinearSystems@SetupCatcodes
    \newcommand&[1][0pt]{\col\hspace{##1}\col}%
    \def+{\col\+{}{}\col}%
    \def-{\col\-{}{}\col}%
    \def={\col\={}{}\col}%
  }
\endgroup

\NewEnviron{LinearSystems}[1]{\begin{alignat}{#1}\BODY\end{alignat}}
\NewEnviron{LinearSystems*}[1]{\begin{alignat*}{#1}\BODY\end{alignat*}}

\xpretocmd{\LinearSystems}{\LinearSystems@Setup}{}{}
\expandafter\xpretocmd\csname LinearSystems*\endcsname{\LinearSystems@Setup}{}{}

\makeatother

\begin{document}
  \begin{LinearSystems}{3}
    4x_1 + x_2 = 1\\
    \-x_1 + x_2 = \-2
  \end{LinearSystems}

  \begin{LinearSystems*}{3}
    4x_1 + x_2 = 1\\
    \-x_1 + x_2 = \-2
  \end{LinearSystems*}

\end{document}

Das ist nicht nur einfacher, sondern auch sicherer. Wer will kann im letzten Argument von \xpretocmd noch eine Fehlerbehandlung für den Fall einfügen, dass das Patchen aus irgendwelchen Gründen nicht funktioniert.

Permanenter link

beantwortet 25 Jan '17, 11:53

Ijon%20Tichy's gravatar image

Ijon Tichy
7.7k11019

bearbeitet 25 Jan '17, 11:54

Das gefällt mir sehr gut, danke!

(25 Jan '17, 14:15) tom75

Wieso nicht einfach \NewEnviron{LinearSystems}[1]{\LinearSystems@Setup\begin{alignat}{#1}\BODY\end{alignat}}?

(26 Jan '17, 11:24) Clemens

@Clemens: Hast du es ausprobiert? Aufgrund der Arbeitsweise von \NewEnviron gelangt bei meinen Tests die catcode-Änderung dabei nicht in den \BODY. Man bräuchte vermutlich eine Art pre-Argument für \NewEnviron, das bereits vor dem Scannen des Inhalts der Umgebung, also vor der Definition von \BODY angewendet wird.

(26 Jan '17, 12:40) Ijon Tichy

@Ijon Verstehe. Nein, ich hatte keine Möglichkeit zu testen. Tatsächlich ist das IMHO dann ein zumindest auf den ersten Blick unerwartetes Verhalten von environ. Auf den zweiten Blick dann auch wieder nicht…

(26 Jan '17, 13:09) Clemens

Das geht für die Sternversion prinzipiell genauso wie für die normale Version:

Öffne in Overleaf
\documentclass{article}
\usepackage{amsmath}
\usepackage{environ}

\makeatletter

\newcommand{\LinearSystems@SetupLets}{%
  \let\col=&%
  \let\+=+%
  \let\-=-%
  \let\===%
}
\newcommand{\LinearSystems@SetupCatcodes}{%
  \catcode`\&=\active
  \catcode`\+=\active
  \catcode`\-=\active
  \catcode`\==\active
}
\newcommand{\LinearSystems@Setup}{}
\begingroup
  \LinearSystems@SetupCatcodes
  \gdef\LinearSystems@Setup{%
    \LinearSystems@SetupLets
    \LinearSystems@SetupCatcodes
    \newcommand&[1][0pt]{\col\hspace{##1}\col}%
    \def+{\col\+{}{}\col}%
    \def-{\col\-{}{}\col}%
    \def={\col\={}{}\col}%
  }
\endgroup

\NewEnviron{LinearSystems}[1]{\begin{alignat}{#1}\BODY\end{alignat}}
\let\LinearSystems@OriginalBegin\LinearSystems
\def\LinearSystems{\LinearSystems@Setup\LinearSystems@OriginalBegin}

\NewEnviron{LinearSystems*}[1]{\begin{alignat*}{#1}\BODY\end{alignat*}}
\expandafter\let\expandafter\sLinearSystems@OriginalBegin\csname LinearSystems*\endcsname
\@namedef{LinearSystems*}{\LinearSystems@Setup\sLinearSystems@OriginalBegin}

\makeatother

\begin{document}
  \begin{LinearSystems}{3}
    4x_1 + x_2 = 1\\
    \-x_1 + x_2 = \-2
  \end{LinearSystems}

  \begin{LinearSystems*}{3}
    4x_1 + x_2 = 1\\
    \-x_1 + x_2 = \-2
  \end{LinearSystems*}

\end{document}

Da der Stern in \LinearSystems* kein Buchstabe ist, man das Makro so also nicht schreiben kann, bin ich über die Command Sequence \csname LinearSystems*\endcsname ausgewichen. Die \expandafter sind notwendig, damit \sLinearSystem@OriginalBegin nicht zu \csname, sondern zu \LinearSystems* wird.

Es sei noch darauf hingewiesen, dass minimal keine Klasse für Minimalbeispiele ist, sondern eine Klasse zum Testen, des Klassenlademechanismus von LaTeX. Für Minimalbeispiele verwendet man besser eine der Standardklassen.

Mit einem Minimum an l3-Syntax geht das übrigens deutlich einfacher:

Öffne in Overleaf
\NewEnviron{LinearSystems}[1]{\begin{alignat}{#1}\BODY\end{alignat}}
\NewEnviron{LinearSystems*}[1]{\begin{alignat*}{#1}\BODY\end{alignat*}}

\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN \LinearSystems@OriginalBegin \LinearSystems
\cs_new_eq:cc {sLinearSystems@OriginalBegin} {LinearSystems*}
\ExplSyntaxOff

\def\LinearSystems{\LinearSystems@Setup\LinearSystems@OriginalBegin}
\@namedef{LinearSystems*}{\LinearSystems@Setup\sLinearSystems@OriginalBegin}

Wenn man an dem Punkt ist, könnte man natürlich auch gleich interne l3-Namen für die beiden OriginalBegin verwenden und die erneute Definition im l3-Context via \DeclareExpandableDocumentCommand vornehmen. Siehe dazu die l3-Doku.

Permanenter link

beantwortet 25 Jan '17, 11:04

saputello's gravatar image

saputello
10.0k53458

bearbeitet 25 Jan '17, 11:33

Vielen Dank!

(25 Jan '17, 11:27) tom75
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×15
×1

Frage gestellt: 25 Jan '17, 10:05

Frage wurde angeschaut: 1,543 Mal

Zuletzt aktualisiert: 26 Jan '17, 13:09