![Утверждения в латексе](https://rvso.com/image/305761/%D0%A3%D1%82%D0%B2%D0%B5%D1%80%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%20%D0%BB%D0%B0%D1%82%D0%B5%D0%BA%D1%81%D0%B5.png)
Я пишу длинный документ 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}