Afirmaciones en látex

Afirmaciones en látex

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 \singledefque 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 \singledeflistmacro 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}

información relacionada