我正在尝试制作一个宏(\ls
),它将关键字转换为其等效逻辑符号的数学模式版本。我已经找到了一种方法来让它正常工作,除非它在另一个函数的参数中(\bda
将参数组织成 lambda 演算函数),在这种情况下它会给我一个
argument of \equal has extra }
错误。请注意,如果仅使用主文档中的前两行,则它们都会导致正确的输出,而只有第三行这样的情况才会导致此错误。
\documentclass[10pt]{article}
\usepackage[margin = 1in]{geometry}
\usepackage[T1]{fontenc}
\usepackage{mathtools}
\usepackage{stmaryrd}
\usepackage{amsmath}
\usepackage{ifthen}
\newcommand{\mm}[1]{$#1$}
\newcommand{\ifis}[4]{\ifthenelse{\equal{#1}{#2}}{#3}{#4}}
\newcommand{\mmifis}[4]{\ifis{#1}{#2}{\mm{#3}}{#4}}
\newcommand{\ls}[1]%
{\mmifis {#1} {and}
{\land}
{\mmifis {#1} {or}
{\lor}
{\mmifis {#1} {in}
{\in}
{\mmifis {#1} {subset}
{\subseteq}
{\mmifis {#1} {psubset}
{\subset}
{\mmifis {#1} {not}
{\neg}
{\mmifis {#1} {exists}
{\exists}
{\mmifis {#1} {forall}
{\forall}
{???}}}}}}}}}
\begin{document}
\ls{and}
\bda{z}{e}{$\land$}{k}
\bda{z}{e}{\ls{and}}{k}
\end{document}
究竟是什么原因导致了这种情况,我该如何修复它,不只是针对这个实例,而且针对将来可能出现的情况?
答案1
宏的替代方案ifthenelse
,它不需要任何包。
\documentclass{article}
\newcommand{\ls}[1]{\begingroup\let\or\lor% locally redefine \or
\let\and\land% locally redefine \and
\let\oldsubset\subset% mess around with subset
\let\psubset\oldsubset%
\let\subset\subseteq%
\ifcsname #1\endcsname%
\ensuremath{\expandafter\csname #1\endcsname}%
\else
???%
\fi\endgroup}
\begin{document}
$\ls{and}\ls{or}\ls{subset}\ls{psubset}\ls{wurzelbrumpf}$
\end{document}