Wie kann ich einen Befehl innerhalb des Arguments eines anderen Befehls verfügbar machen?

Wie kann ich einen Befehl innerhalb des Arguments eines anderen Befehls verfügbar machen?

Wenn ich eine Umgebung mit definiere , kann ich im „Vorher“-Teil \newenvironmentverwenden , um dem Code innerhalb der Umgebung Befehle zur Verfügung zu stellen.newcommand

Ist dies mit einfachen Befehlen möglich? Mit anderen Worten, kann ich einen Befehl so erstellen, dass der Benutzer in das Argument ein Makro verwenden kann, das nicht außerhalb definiert ist?

Beispiel: Angenommen, ich möchte einen Befehl zum Setzen von Definitionen mathematischer Mengen codieren \setund ich möchte einen \suchthatdarin zu verwendenden Befehl, wie in:

\set{x\in X \suchthat x > 42}

Das ist einfach, aber ich möchte, \suchthatdass der Befehl nur innerhalb eines Arguments verfügbar ist \set.

Antwort1

Sie können einen Befehl wie folgt definieren:

\newcommand\set[1]{%%
   \begingroup
     \def\suchthat{... some definition...}%%
     ... other macro content ....
    \endgroup}

Und dies wird \suchthatinnerhalb des Makros verfügbar gemacht.

Sie hätten dies mit \bgroupund tun können \egroup, aber das erzeugt eine Unterformel mit Auswirkungen auf die Handhabung der Abstände, wenn sie im Mathematikmodus verwendet wird. Die \begingroupund \endgrouplokalisieren hier die Definition neuer Makros. Sie können eine der folgenden Optionen verwenden, um einen lokalen Befehl zu definieren: \def, \edef, und \newcommand.

Wenn Sie dem Vorschlag von @barbarabeeto folgen, könnten Sie in Ihrer Präambel etwa Folgendes tun:

\makeatletter
\def\ae@suchthat{... definition of such that ...}
\newcommand\aset[1]{%%
  \let\suchthat\ae@suchthat
    the body of the macro: #1
  \let\suchthat\undefined
}
\makeatother

Das ist viel besser. Zusätzlich zu den von barbarabeeto genannten Gründen würde dies Ihrem Makro – falls Sie dies wünschen – auch ermöglichen, Werte zu definieren oder festzulegen, auf die Sie später im Dokument zugreifen möchten. Bei diesem \begingroup/\endgroupAnsatz müssten diese globalisiert werden, was möglicherweise nicht das ist, was Sie möchten.

Ein hybrider Ansatz könnte so aussehen

\makeatletter
\def\ae@suchthat{... definition of such that ...}
\newcommand\aset[1]{%%
  \begingroup
    \let\suchthat\ae@suchthat
      the body of the macro: #1
  \endgroup
}
\makeatother

Antwort2

Die Vorschläge von A. Ellett sind gut, aber mit diesem Ansatz sind einige Feinheiten verbunden.

  1. Die Lokalisierung der Definition mit \bgroupund \egroupist schlecht, da das \setMakro eindeutig im Mathematikmodus verwendet wird. Eine solche Konstruktion würde eine Unterformel ergeben, mit der Folge, dass Leerzeichen eingefroren werden und nicht an der Streckung und Verkürzung der Zeile beteiligt sind; die Verwendung von \begingroupund \endgrouphat dieses Problem nicht.

  2. Eine Standarddefinition \suchthatmuss auf jeden Fall angegeben werden, da es vorkommen kann, dass Sie etwas \suchthatin einem Abschnittstitel wünschen.

  3. Aus demselben Grund sollten beide Befehle robust gemacht werden.

Hier ist eine Implementierung.

\documentclass{article}
\usepackage{etoolbox}

\makeatletter
\newrobustcmd{\suchthat}{%
  \@latex@error{Use \noexpand\suchthat only in \string\set}
    {You are allowed to use \noexpand\suchthat only in the\MessageBreak
     argument of \string\set}%
}
\newcommand\giga@suchthat{\mid}
\newrobustcmd{\set}[1]{%
  \begingroup
  \let\suchthat\giga@suchthat
  \{\,#1\,\}%
  \endgroup
}
\makeatother

\begin{document}

\tableofcontents

\section{The set $\set{x\in X \suchthat x>42}$}

Let's study $\set{x\in X \suchthat x>42}$.

\suchthat

\end{document}

Die Ausgabe im Terminal:

! LaTeX Error: Use \suchthat only in \set.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.27 \suchthat

? h
You are allowed to use \suchthat only in the
argument of \set

Die Ausgabe

Bildbeschreibung hier eingeben

verwandte Informationen