
[BEARBEITET, um zu zeigen, wo ich das optionale Argument tatsächlich verwenden möchte]
Diese Frage kann beantwortet werden unterWie übergebe ich ein optionales Argument an eine Umgebung mit wörtlichem Inhalt?, aber ich habe Schwierigkeiten, diese Antwort auf mein Problem anzuwenden. Ich werde diese Abfrage löschen, wenn sie als Duplikat betrachtet wird.
Wenn ich eine verbatim-ähnliche Umgebung verwende, die ein optionales Argument annimmt (vb im MWE unten), wird in Fällen, in denen kein optionales Argument angegeben ist, das erste Token in der Umgebung manchmal außerhalb der Umgebung ausgeführt.
\documentclass{article}
\usepackage{verbatim}
\parskip 1ex\parindent 0em
\makeatletter
\newenvironment{va}{%
\def\verbatim@processline{%
{\setbox0=\hbox{\the\verbatim@line}%
\hsize=\wd0 \the\verbatim@line\par}}%
\setbox0=\vbox\bgroup \verbatim
}
{%
\endverbatim
\unskip\setbox0=\lastbox %
\egroup
\usebox0
}
\newenvironment{vb}[1][]{%
\def\verbatim@processline{%
{\setbox0=\hbox{\the\verbatim@line}%
\hsize=\wd0 \the\verbatim@line\par}}%
\setbox0=\vbox\bgroup #1 \verbatim
}
{%
\endverbatim
\unskip\setbox0=\lastbox %
\egroup
\usebox0
}
\makeatother
\begin{document}
I created two environments based on \verb|boxedverbatim| environment.
Environment \verb|va| takes no arguments. Environment \verb|vb| is
identical but takes an optional argument (which is not actually used for
anything in this MWE). In all the following cases, no optional argument
is actually passed to the \verb|vb| environment
Starting either environment with a letter works:
\begin{va}I will set \def\x{1}\end{va}
\begin{vb}I will set \def\x{1}\end{vb}
But if I start the environments with a command like \verb|\Huge|, the
\verb|vb| environment executes that command outside the environment, even
though it was not in brackets:
\begin{va}\Huge I will set \def\x{1}\end{va}
\begin{vb}\Huge I will set \def\x{1}\end{vb}
If I start the verbatim with a \verb|\def|, the \verb|vb|
environment breaks
\begin{va}\def\x{1}\end{va}
%\begin{vb}\def\x{1}\end{vb}
\end{document}
Antwort1
Wie bei allen Verbatim-Befehlen müssen Sie das Catcode-Regime wechseln, bevor Sie nach Argumenten suchen. Sobald ein Zeichen tokenisiert wurde, haben die von Verbatim festgelegten Catcode-Werte keine Auswirkung mehr, da Catcodes keine Auswirkungen auf einmal erstellte Token haben, sondern nur bestimmen, wie Token aus der Dateieingabe erstellt werden.
In
\begin{vb}\Huge
\vb
schaut auf den nächstenZeichenum zu sehen, ob es so ist [
. TeX muss die Datei lesen, um das nächste Token zu generieren, also liest es alles \Huge
und erstellt ein cs-Token. Danach wirken sich alle Einstellungen von catcode nur auf Zeichen aus, die aus der Datei gelesen werden; sie wirken sich nicht auf aus Huge
.
Sie müssen nach dem Einrichten der Catcodes nur nach Argumenten suchen:
\newcommand\innervb[1][]{}
\newenvironment{vb}{%
\def\verbatim@processline{%
{\setbox0=\hbox{\the\verbatim@line}%
\hsize=\wd0 \the\verbatim@line\par}}%
\setbox0=\vbox\bgroup \verbatim\innervb
}
{%
\endverbatim
\unskip\setbox0=\lastbox %
\egroup
\usebox0
}