![Latex 中的斷言](https://rvso.com/image/305761/Latex%20%E4%B8%AD%E7%9A%84%E6%96%B7%E8%A8%80.png)
我正在編寫一個很長的乳膠文檔,並使用許多巨集來定義數學符號。我想確保符號中沒有衝突。例如,類似的東西
\newcommand{\symbolone}{A}
\newcommand{\symboltwo}{A}
不應該發生。有沒有像乳膠中的斷言這樣我可以做的事情
\assert{\symbolone != \symboltwo}
?
答案1
\singledef
我的解決方案引入了定義控制序列(如)的宏\def
,但提供了另外兩個功能:
- 它檢查控制序列是否已定義。如果是,則列印錯誤訊息並且控制序列保持其原始含義。
- 它將定義的控制序列的名稱儲存到
\singledeflist
內部巨集中。當透過 then 定義下一個控制序列時,\singledef
它被定義,但會檢查是否\ifx
定義了相同的控制序列(等效的 via )並保存在 中\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}