Утверждения в латексе

Утверждения в латексе

Я пишу длинный документ Latex и использую много макросов для определения математических символов. Я хотел бы убедиться, что нет никаких конфликтов в обозначениях. Например, что-то вроде

\newcommand{\symbolone}{A}
\newcommand{\symboltwo}{A}

не должно произойти. Есть ли что-то вроде утверждения в латексе, что я могу сделать

\assert{\symbolone != \symboltwo} 

?

решение1

Мое решение представляет собой макрос \singledef, который определяет последовательность управления (например \def, ), но предоставляет еще две функции:

  • он проверяет, определена ли управляющая последовательность. Если да, то выводится сообщение об ошибке, а управляющая последовательность сохраняет свое первоначальное значение.
  • сохраняет имя определенной последовательности управления во \singledeflistвнутреннем макросе. Когда следующая последовательность управления определяется через , \singledefто она определяется, но проверяется, \ifxбыла ли определена и сохранена та же последовательность управления (эквивалентная через ) \singledeflist. Если да, то выводится сообщение об ошибке, а новая последовательность управления остается неопределенной.

Код:

\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

решение2

@egreg показал, как сравнить две полностью развернутые строки (О проверке двух полностью развернутых строк символов на равенство), и вы можете применить его технику здесь.

Я добавил сообщение об ошибке на случай повторного использования символа.

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

Связанный контент