我想要一个\newcommand{\inspect}[1]{...}
这样的:
根据输入是否包含特定符号,其行为会有所不同。例如:
\newcommand{\inspect}[1]{ \ifthenelse{"#1 contains a '<' or a '\in'"}{#1}{aaa} }
我希望可以使用正则表达式进行测试。
或者
根据输入的宽度,其行为会有所不同。例如,使用包
ifthen
和calc
我会写:\newcommand{\inspect}[1]{ \ifthenelse{\lengthtest{\widthof{#1} < \widthof{aaa}}}{#1}{aaa} }
但这不起作用(我想是因为该
\widthof
命令不能在这个设置中使用)
顺便说一下,我想要这个的具体原因是我创建了一个如下的宏:
\newcommand{\Forall}[1]{\forall \, #1 \,\,}
并在两种截然不同的环境中广泛使用它:当量化表达式很简单时,以及当它类似于时x \in X
。在第二种情况下,我需要在量化表达式和公式的其余部分之间留出比第一种情况更多的空间。我不想手动执行此操作,因为这样会很多工作的。
提前致谢。
答案1
有一种标准方法可以检查原子公式是否包含关系符号:将其排版两次,一次正常排版,一次使用\thickmuskip=0mu
。如果第一种情况的结果大于第二种情况的结果,则存在关系符号。
\documentclass{article}
\makeatletter
\newcommand{\inspect}[1]{%
\def\inspectspace{\mskip6mu\relax}% the same as \,\,
\sbox\z@{$#1$}% normal spacing
\sbox\tw@{\thickmuskip=0mu$#1$}% zero spacing around relations
\ifdim\wd\tw@<\wd\z@ \def\inspectspace{\mskip12mu\relax}\fi % double
}
\makeatother
\newcommand{\Forall}[1]{%
\inspect{#1}%
\forall\,#1\inspectspace
}
\begin{document}
$\Forall{x}f(x)$
$\Forall{x\in y}f(x)$
$\Forall{x<y}f(x)$
$\Forall{x>y}f(x)$
$\Forall{x\neq y}f(x)$
\end{document}
答案2
如果ifthenelse
不适用于calc
类似语法,\widthof
请向该包的作者投诉,但我只会直接使用 tex 测试。
\newcommand{\inspect}[1]{%%%%
\setbox0\hbox{$#1$}%
\setbox2\hbox{$aaa$}%
\ifdim\wd0<\wd2 \fooa\else\foob\fi
}
\newcommand\fooa{something with \box0}
\newcommand\fooa{something else with \box0}
这是假设您不需要上标等(在这种情况下需要更复杂的构造,以便盒子测量可以在较小的尺寸下工作)
答案3
可以通过 pdfTeX 的 来判断 是否<textA>
在 中。如果未找到匹配项,或者如果在 中匹配,则结果为无效。<textB>
\pdfmatch{<textA>}{<textB>}
-1
<textA>
0
1
<textA>
<textB>
\documentclass{article}
\newcommand{\inspect}[1]{
#1
\mbox{ contains }
\ifnum\pdfmatch{<}{#1}=1
{<}
\fi
\ifnum\pdfmatch{\in}{#1}=1
{\in}
\fi
}
\begin{document}
$\inspect{x}$
$\inspect{x \in X}$
$\inspect{x > X}$
$\inspect{x < X}$
\end{document}
请参阅章节8.15 字符串的pdfTeX 用户手册。
答案4
\documentclass{article}
\newcommand\inspect[1]{%
\def\matchresult{F}%
\haslt#1<\relax%
\hasin#1\in\relax%
\setbox0=\hbox{$#1$}%
\ifdim\wd0<3ex\relax\def\matchresult{T}\fi%
\if T\matchresult #1\else \textbf{*$#1$*}\fi%
}
\def\haslt#1<#2\relax{\ifx\relax#2\relax\else\def\matchresult{T}\fi}
\def\hasin#1\in#2\relax{\ifx\relax#2\relax\else\def\matchresult{T}\fi}
\begin{document}
$\inspect{A}$ is short enough to pass test
$\inspect{A B C}$ fails test
$\inspect{B < C}$ includes less than and passes test
$\inspect{x \in y}$ includes in and passes test
\end{document}