
Wenn ich eine Umgebung mit definiere , kann ich im „Vorher“-Teil \newenvironment
verwenden , 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 \set
und ich möchte einen \suchthat
darin zu verwendenden Befehl, wie in:
\set{x\in X \suchthat x > 42}
Das ist einfach, aber ich möchte, \suchthat
dass 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 \suchthat
innerhalb des Makros verfügbar gemacht.
Sie hätten dies mit \bgroup
und tun können \egroup
, aber das erzeugt eine Unterformel mit Auswirkungen auf die Handhabung der Abstände, wenn sie im Mathematikmodus verwendet wird. Die \begingroup
und \endgroup
lokalisieren 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/\endgroup
Ansatz 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.
Die Lokalisierung der Definition mit
\bgroup
und\egroup
ist schlecht, da das\set
Makro 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\begingroup
und\endgroup
hat dieses Problem nicht.Eine Standarddefinition
\suchthat
muss auf jeden Fall angegeben werden, da es vorkommen kann, dass Sie etwas\suchthat
in einem Abschnittstitel wünschen.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