Ich komme zu Ihnen, weil ich gerne wissen möchte, wie man einen neuen Befehl erstellt, der genau wie \Alph
oder funktioniert \roman
.
Ich möchte ein Nummerierungssystem erstellen: Semel, Bis, Ter, Quater, ..., das ich für Untergleichungen, Unterabbildungen und Untertabellen verwenden würde.
Ich habe den folgenden Code erstellt:
\documentclass{article}
\usepackage{amsmath}
\usepackage{etoolbox}
\newcommand*\newnum[1]{
\ifcase#1\unskip
\or semel
\or bis
\or ter
\or quater
\or quinquies
% etc
\fi
}
\patchcmd\subequations
{\def\theequation{\theparentequation\alph{equation}}}
{\def\theequation{\theparentequation\newnum{equation}}}
{}{\FAIL}
\begin{document}
\begin{subequations}
\begin{align}
f(x) &= ax +b +c \\
&= x \left(a + \frac{b}{x} + \frac{c}{x} \right) \\
&= ax + x \left( \frac{b}{x} + \frac{c}{x} \right)
\end{align}
\end{subequations}
\end{document}
Aber ich erhalte diesen Fehler:
! Missing number, treated as zero.
Wie erstelle ich also einen funktionierenden Befehl? Eine andere Frage: Wie erstellt man einen Befehl dieser Art, der jedoch kein Argument benötigt? (Beispielsweise existieren sowohl \Alph
als auch \Alph{}
)
Antwort1
Wird verwendet , um den Wert eines LaTeX-Zählers in arabischen Ziffern zu erhalten.\value{⟨counter⟩}
Übrigens: Ich schlage vor, Leerzeichen aus der Ausgabe des Makros vollständig zu entfernen. So kann der Benutzer sie explizit an beliebiger Stelle einfügen.
\documentclass{article}
\usepackage{amsmath}
\usepackage{etoolbox}
\makeatletter
\newcommand*\newnum[1]{%
\ifcase\value{#1}%
\or semel%
\or bis%
\or ter%
\or quater%
\or quinquies%
% etc
\else\@ctrerr
\fi
}
\makeatother
% Don't use a space but use a thin space (\,) as Bernard did in his answer:
\patchcmd\subequations
{\def\theequation{\theparentequation\alph{equation}}}
{\def\theequation{\theparentequation\ifnum\value{equation}<1 \else\protect\,\fi\newnum{equation}}}
{}{\FAIL}
\begin{document}
\begin{subequations}
\begin{align}
f(x) &= ax +b +c \\
&= x \left(a + \frac{b}{x} + \frac{c}{x} \right) \\
&= ax + x \left( \frac{b}{x} + \frac{c}{x} \right)
\end{align}
\end{subequations}
\end{document}
Übrigens: Ihre zweite Frage
Eine weitere Frage: Wie erstellt man einen Befehl dieser Art, der jedoch kein Argument benötigt? (Beispielsweise sind sowohl
\Alph
als auch\Alph{}
vorhanden)
ist mir nicht klar:
\documentclass{article}
\begin{document}
\show\Alph
\end{document}
verrät:
> \Alph=macro:
#1->\expandafter \@Alph \csname c@#1\endcsname .
l.3 \show\Alph
Es handelt sich hierbei \Alph
um ein Makro, welches bei der Erweiterung in jedem Fall ein nicht abgegrenztes Argument verarbeitet.
Dieses nicht abgegrenzte Argument muss der Name eines LaTeX-Zählers sein.
Dieses Argument wird in verpackt .\expandafter\@Alph\csname c@⟨counter⟩\endcsname
Dadurch \expandafter
wird sichergestellt, dass das Kontrollwort-Token aus der ..- Konstruktion gebildet wird, bevor es auf dieses Kontrollwort-Token angewendet wird. Das Kontrollwort-Token bezeichnet das TeX- Register, das dem betreffenden LaTeX-Zähler zugrunde liegt.\c@counter
\csname
\endcsname
\@Alph
\c@counter
\count
Dies \Alph
ist auch ein Wrapper, \@Alph
der dazu dient, etwas zu bilden (ein Kontrollwort-Token, das ein \count
-Register bezeichnet), das als TeX-⟨Nummer⟩-Menge aus dem Namen eines LaTeX-Zählers.
\@Alph
verarbeitet wiederum ein Argument, das ein TeX-⟨Nummer⟩-Menge.
Ein TeX-⟨Nummer⟩-Menge wiederum kann beispielsweise ein Steuerwort-Token sein, das ein \count
in Bezug auf zugewiesenes -Register bezeichnet \countdef
.
Aber das ist noch nicht alles. Ein TeX-⟨Nummer⟩-quantity kann z. B. eine alphabetische Konstante, etwas wie `\a
oder eine Ziffernfolge sein.
(Weitere Einzelheiten zu den Syntaxregeln für TeX-⟨Nummer⟩-Mengen finden Sie im TeXBook, Kapitel 24: Zusammenfassung des vertikalen Modus.)
Natürlich kannst du \newnum
es \@newnum
auch so umsetzen:
\documentclass{article}
\makeatletter
\newcommand*\@newnum[1]{%
\ifcase#1%
\or semel%
\or bis%
\or ter%
\or quater%
\or quinquies%
% etc
\else\@ctrerr
\fi
}%
\newcommand*\newnum[1]{%
\expandafter\@newnum\csname c@#1\endcsname
}%
\makeatother
\newcounter{testcounter}
\begin{document}
Testing \verb|\newnum| (argument must denote a \LaTeX-counter):
\medskip
\setcounter{testcounter}{1}
\newnum{testcounter}
\setcounter{testcounter}{2}
\newnum{testcounter}
\setcounter{testcounter}{3}
\newnum{testcounter}
\setcounter{testcounter}{4}
\newnum{testcounter}
\bigskip
Testing \verb|\@newnum| (argument must denote a \TeX-number-quantity):
\medskip
\makeatletter
\@newnum{1}%
\@tempcnta=2
\@newnum{\@tempcnta}%
\setcounter{testcounter}{3}
\@newnum{\value{testcounter}}%
\@newnum{`\^^D}
\makeatother
\end{document}
Antwort2
Ich konnte es nicht patchen, aber hier ist ein Code zum Neudefinieren der Umgebung (oder zum Definieren Ihrer eigenen Untergleichungsumgebung):
\documentclass{article}
\usepackage{amsmath}
\usepackage{etoolbox}
\makeatletter%
\def\newnum#1{\expandafter\@newnum\csname c@#1\endcsname}
\def\@newnum#1{%
\ifcase#1\or semel\or bis\or ter\or quater\or quinquies\or sexies\or septies\or octies\or nonies\else\@ctrerr\fi}
\renewenvironment{subequations}{%
\refstepcounter{equation}%
\protected@edef\theparentequation{\theequation}%
\setcounter{parentequation}{\value{equation}}%
\setcounter{equation}{0}%
\def\theequation{\theparentequation\,\newnum{equation}}%
\ignorespaces
}{%
\setcounter{equation}{\value{parentequation}}%
\ignorespacesafterend
}
\makeatother
\begin{document}
\setcounter{equation}{3}
\begin{equation}\label{eq}
a = b
\end{equation}
\begin{subequations}
\begin{align}
f(x) &= ax +b +c \\
&= x \left(a + \frac{b}{x} + \frac{c}{x} \right) \\
&= ax + x \left( \frac{b}{x} + \frac{c}{x} \right)
\end{align}
\end{subequations}
\end{document}