![Asserções em látex](https://rvso.com/image/305761/Asser%C3%A7%C3%B5es%20em%20l%C3%A1tex.png)
Estou escrevendo um longo documento de látex e uso muitas macros para definir símbolos matemáticos. Gostaria de garantir que não haja conflito na notação. Por exemplo, algo como
\newcommand{\symbolone}{A}
\newcommand{\symboltwo}{A}
não deveria acontecer. Existe algo como uma afirmação em látex que eu possa fazer
\assert{\symbolone != \symboltwo}
?
Responder1
Minha solução apresenta a macro \singledef
que define a sequência de controle (como \def
), mas fornece mais dois recursos:
- verifica se a sequência de controle está definida. Se sim, então a mensagem de erro é impressa e a sequência de controle mantém seu significado original.
- ele salva o nome da sequência de controle definida na
\singledeflist
macro interna. Quando a próxima sequência de controle é definida via\singledef
então ela é definida mas é verificado se a mesma sequência de controle (equivalente via\ifx
) foi definida e salva em\singledeflist
. Se sim, então a mensagem de erro é impressa e a nova sequência de controle é mantida indefinida.
O 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
Responder2
@egreg mostrou como comparar duas strings totalmente expandidas (Ao testar duas cadeias de caracteres totalmente expandidas para igualdade), e você poderia aplicar a técnica dele aqui.
Adicionei uma mensagem de erro caso você reutilize um 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}