![Behauptungen in Latex](https://rvso.com/image/305761/Behauptungen%20in%20Latex.png)
Ich schreibe ein langes Latex-Dokument und verwende viele Makros zum Definieren mathematischer Symbole. Ich möchte sicherstellen, dass es keine Konflikte in der Notation gibt. Zum Beispiel so etwas wie
\newcommand{\symbolone}{A}
\newcommand{\symboltwo}{A}
sollte nicht passieren. Gibt es so etwas wie eine Behauptung in Latex, die ich tun kann
\assert{\symbolone != \symboltwo}
?
Antwort1
Meine Lösung führt das Makro ein \singledef
, das die Steuersequenz definiert (wie \def
), bietet aber zwei weitere Funktionen:
- Es wird geprüft, ob die Steuersequenz definiert ist. Wenn ja, wird eine Fehlermeldung ausgegeben und die Steuersequenz behält ihre ursprüngliche Bedeutung.
- es speichert den Namen der definierten Steuersequenz im
\singledeflist
internen Makro. Wenn die nächste Steuersequenz über definiert wird\singledef
, wird sie definiert, es wird jedoch geprüft, ob dieselbe Steuersequenz (äquivalent über\ifx
) in definiert und gespeichert wurde\singledeflist
. Wenn ja, wird eine Fehlermeldung ausgegeben und die neue Steuersequenz bleibt undefiniert.
Der Code:
\def\singledeflist{}
\def\singledef#1{%
\ifx#1\undefined
\def\next{\singledefA#1}%
\afterassignment\next
\expandafter\def\expandafter#1%
\else
\errmessage{The \string#1 is defined already}%
\expandafter\def\expandafter\tmp
\fi
}
\def\singledefA#1{\def\next{\singledefB#1}\expandafter\next\singledeflist\end}
\def\singledefB#1#2{%
\ifx#2\end
\expandafter\def\expandafter\singledeflist\expandafter{\singledeflist#1}%
\else
\ifx#1#2%
\errmessage{The \string#1 is the same as \string#2}%
\let#1=\undefined
\singledefC
\fi
\expandafter\next
\fi
}
\def\singledefC#1\end{\fi\fi}
\singledef\A{aha} % this is like \def\A{aha}
\singledef\B{bha} % this is like \def\B{bha}
\singledef\C{bha} % this prints the error: The \C is the same as \B
Antwort2
@egreg hat gezeigt, wie man zwei vollständig erweiterte Zeichenfolgen vergleicht (Zum Testen der Gleichheit zweier vollständig erweiterter Zeichenfolgen), und Sie könnten seine Technik hier anwenden.
Ich habe eine Fehlermeldung hinzugefügt für den Fall, dass Sie ein Symbol wiederverwenden.
\documentclass{article}
\usepackage{pdftexcmds}
\newcommand{\symbolI}{A}
\newcommand{\symbolII}{\pi r^2}
\newcommand{\symbolIII}{\pi r^2}
\makeatletter
\newcommand{\TestSameSymbols}[2]{%
\ifnum\pdf@strcmp{#1}{#2}=\z@
\typeout{%
ERROR: \noexpand#2 (#2) is the same as \noexpand#1.%
}
\fi%
}
\makeatother
\begin{document}
\TestSameSymbols{\symbolI}{\symbolII}
\TestSameSymbols{\symbolII}{\symbolIII}
\[ \symbolI = \symbolII \]
\end{document}