Newcommand: Was kann nicht getan werden?

Newcommand: Was kann nicht getan werden?

Es ist nicht das erste Mal, dass ich erfolglos versucht habe, einen neuen Befehl zu erstellen. Einige Dinge, die ich herausgefunden habe, funktionierten nicht (ich erhalte die Fehlermeldung „undefinierte Steuersequenz“ oder andere).

  • Verwenden Sie ein Anführungszeichen-Ende-Argument.

    \newcommand{\mytest}[1]{
      \quote #1 \endquote
    }
    
  • Verwenden Sie den \verbBefehl mit dem Argument

    \newcommand{\mytest}[1]{
      \verb+#1+
    }
    
  • Nutzen Sie die begin{lstlisting}Umgebung:

    \newcommand{\mytest}[1]{
      \begin{lstlisting}
      #1
      \end{lstlisting}
    }
    

Wissen Sie, wo ich eine vollständige Liste dessen finden kann, was ich verwenden kann \newcommandund was nicht? Und noch besser, warum?

Antwort1

Es ist ziemlich schwierig zu sagen, was Sie mit einem machen können \newcommand, da die Möglichkeiten (wirklich) unendlich sind.

Ich kann über Ihre beiden Beispiele sprechen und auf die Fehler hinweisen, die Sie machen.

In der ersten Definition verwenden Sie \quoteund \endquoteund das ist ein Fehler; \quoteist der Befehl, den LaTeX ausführt, wenn es findet \begin{quote}, aber das passiertnachdem eine Gruppe geöffnet wurdeals Nebeneffekt von \begin. Die Gruppe wird normalerweise durch geschlossen, \endwenn LaTeX findet, \end{quote}wodurch die durch vorgenommenen Einstellungen der Parameter automatisch rückgängig gemacht werden \quote.

Mit Ihrer Definition \mytest{something}werden Sie feststellen, dass die Linienbreitedauerhaft geändertund die linke Einrückung wird endlos weitergehen. Stattdessen kann man mit Sicherheit sagen:

\newenvironment{myenv}{\quote}{\endquote}

\begin{myenv}da die Gruppierung durch und bereitgestellt wird \end{myenv}.

Was ist das Hauptmerkmal von \newcommand? Schauen wir uns ein einfaches Beispiel an:

\newcommand{\foo}[1]{?#1!}

Wenn Sie nun eingeben \foo{xyz}, ist das genau dasselbe, als würden Sie eingeben

?xyz!

weil TeX beim Scannen \fooweiß, dass es ein Argument finden muss (das erste Token danach, \foowenn dies nicht der Fall ist, {oder die gesamte Tokenliste bis zum passenden }) und durch den in der Anweisung \foo<argument>angegebenen Ersetzungstext ersetzen muss, wobei durch gekennzeichnet ist .\newcommand<argument>#1

Sie können bis zu neun Argumente haben (oder auch gar keines). Es wird lediglich dieser „Ersatz“ durchgeführt. Mit geeigneten Definitionen und bedingten Strukturen können Sie sogar rekursive Makros definieren, aber das zu beschreiben würde zu lange dauern. Der größte Teil der „Benutzerdefinitionen“ sind nur einfache (oder leicht komplexe) Ersetzungen zum Markieren logischer Einheiten.

TeX prüft nicht, was nach einem Befehl kommt, bis eshatzu. Wenn also ausgeführt wird \foo, wird nicht über das Argument hinausgegangen und kein Makro innerhalb des Arguments erweitert, bis der Makroersatz beendet ist. Also nach

\foo{\baz{x}}

TeX wird sehen

?\baz{x}!

Danach wird es zunächst verarbeitet ?und dann \baz{x}so, als ob diese von Anfang an in der Eingabe gewesen wären, jedoch mit einem kleinen Unterschied, der in Ihrem zweiten Beispiel angezeigt wird.

Der Unterschied beim Eintippen \foo{\baz{x}}besteht ?\baz{x}!darin, dass TeX bereitstokenisiert \baz{x}.

Der \verbBefehl funktioniert, indem er die Bedeutung aller Sonderzeichen ändert. Dies geschieht, indem er die Aufnahme des zu setzenden Textes so lange verzögert, bis er wortwörtlich aufgenommen werden kann, und dies geschieht in einer Gruppe; so

\verb+\baz{x}+

werde die folgenden Schritte ausführen

  1. Eröffnen Sie eine Gruppe (durch Angabe von {)
  2. Beginnen Sie mit dem Satz in der Monospace-Schriftart
  3. Ändern Sie die Bedeutung aller Sonderzeichen in „druckbar“.
  4. Definieren Sie +das Verhalten als }(das Gruppenabschlusstoken)
  5. Setzen Sie weiter, was immer Sie finden
  6. Der nachfolgende Text +macht alle speziellen Einstellungen rückgängig

Die Beschreibung ist nicht vollständig, aber für unsere Zwecke ausreichend; es gibt noch weitere technische Details, die für das Verständnis des Gesamtbildes irrelevant sind.

Was passiert, wenn Sie definieren

\newcommand{\foo}[1]{\verb+#1+}

wie Sie vorschlagen? Wenn TeX \foo{\baz{x}}es sieht, muss es nach einem Argument suchen und es tokenisieren. Daher ist das Argumentvier Token(Ich trenne sie durch •)

\baz • { • x • }

und es kann keine Änderung der Bedeutung \von mehr vorgenommen werden. Schlimmer noch, das , das seine Bedeutung ändern sollte, um das Gruppenabschlusstoken zu werden, kann nicht geändert werden, da es bereits zum Zeitpunkt der Definition tokenisiert wurde. Daher verfügt LaTeX über einen Schutzmechanismus, der nicht zulässt, dass es im Argument eines Befehls vorkommt, da bei Verwendung an einer solchen Stelle alles Mögliche passieren könnte: Wenn Sie die Bedeutung von Sonderzeichen ändern, ohne die Möglichkeit zu haben, die Einstellung rückgängig zu machen, würden Sie in eine Ecke ohne Ausweg drängen.{}+\verb

Gibt es Workarounds? Ja, sieheWie fügt man den \verb-Befehl in einen \textbf{}-Block ein?, aber fragen Sie sich zunächst, ob Sie das Argument zu einem Befehl überhaupt wörtlich benötigen.

verwandte Informationen