![Afirmaciones en látex](https://rvso.com/image/305761/Afirmaciones%20en%20l%C3%A1tex.png)
Estoy escribiendo un documento extenso en látex y uso muchas macros para definir símbolos matemáticos. Me gustaría asegurarme de que no haya conflictos en la notación. Por ejemplo, algo como
\newcommand{\symbolone}{A}
\newcommand{\symboltwo}{A}
no debería suceder. ¿Existe algo así como una afirmación en látex que pueda hacer?
\assert{\symbolone != \symboltwo}
?
Respuesta1
Mi solución introduce la macro \singledef
que define la secuencia de control (como \def
) pero proporciona dos características más:
- comprueba si la secuencia de control está definida. En caso afirmativo, se imprime el mensaje de error y la secuencia de control mantiene su significado original.
- guarda el nombre de la secuencia de control definida en la
\singledeflist
macro interna. Cuando se define la siguiente secuencia de control mediante\singledef
, se define pero se verifica si la misma secuencia de control (equivalente a través de\ifx
) se definió y guardó en\singledeflist
. En caso afirmativo, se imprime un mensaje de error y la nueva secuencia de control se mantiene sin definir.
El código:
\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
Respuesta2
@egreg ha mostrado cómo comparar dos cadenas completamente expandidas (Al probar la igualdad de dos cadenas de caracteres completamente expandidas), y podrías aplicar su técnica aquí.
He agregado un mensaje de error en caso de que reutilices un símbolo.
\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}