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, 16:05

tom75's gravatar image

tom75
2.2k277984
Akzeptiert-Rate: 57%

bearbeitet 25 Jan '17, 17:07

saputello's gravatar image

saputello
11.1k174365


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, 17:53

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 25 Jan '17, 17:54

Das gefällt mir sehr gut, danke!

(25 Jan '17, 20:15) tom75

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

(26 Jan '17, 17:24) cgnieder

@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, 18:40) gast3

@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, 19:09) cgnieder

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, 17:04

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 25 Jan '17, 17:33

Vielen Dank!

(25 Jan '17, 17:27) tom75
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×16
×1

gestellte Frage: 25 Jan '17, 16:05

Frage wurde gesehen: 5,920 Mal

zuletzt geändert: 26 Jan '17, 19:09