我正在定义一个命令,用于显示带括号的段落及其之间的同构,但我希望该命令能够识别其中一个段落是否是纯数学内容,因此不显示花括号。让我详细说明一下。
我的第一次尝试纯粹是面向段落的。我创建了一个命令来为段落赋予形状(使用varwidth
),为它们添加括号,然后创建另一个命令来链接它们:
\newcommand{\parrafo}[1]{%
\left\{%
\begin{varwidth}{0.25\textwidth}%
\centering%
\textnormal{#1}%
\end{varwidth}%
\right\}%
}
\NewDocumentCommand{\reticulos}{omm}{%
\begin{equation*}%
\parrafomath{#2} \xrightarrow{\sim} \parrafomath{#3}%
\IfValueT{#1}{\xrightarrow{\sim}\parrafomath{#1}}%
\end{equation*}%
}
然后,挑战就出现了,当三个段落中有一个是数学结构(例如空格)时\(E\)
,命令仍会呈现括号,看起来像一组元素。
因此,由于我自己或在网上都找不到解决方案,我询问了 ChatGPT,他们能做的就是识别传递给命令的字符串是否以 开头$
,因为与 不同,\( \)
只有一个字符需要检查。代码是:
\documentclass{article}
\usepackage{amsmath}
\usepackage{varwidth}
% Detect math mode with $
\makeatletter
\newcommand{\detectar}[1]{%
\expandafter\@detectar#1$\@end$%
}
\def\@detectar#1$#2\@end${%
\ifx\relax#1\relax%
\expandafter\@secondoftwo
\else%
\expandafter\@firstoftwo
\fi
{\@firstoftwo}%
{\@secondoftwo}%
}
\makeatother
% \parrafo modified to act differently if a formula is passed
\newcommand{\parrafoMath}[1]{%
\detectar{#1}{%
\left\{%
\begin{varwidth}{0.25\textwidth}%
\centering%
\textnormal{#1}%
\end{varwidth}%
\right\}%
}{%
\textnormal{#1}% %to eliminate the problems of nested math mode
}%
}
% \reticulos updated with \parrafoMath
\NewDocumentCommand{\reticulosMath}{omm}{%
\begin{equation*}%
\parrafoMath{#2} \xrightarrow{\sim} \parrafoMath{#3}%
\IfValueT{#1}{\xrightarrow{\sim}\parrafoMath{#1}}%
\end{equation*}%
}
\begin{document}
\reticulosMath{$E$}{text}
\reticulosMath[$E$]{text}{text}
\end{document}
此版本运行正常,但仅使用$ $
,它无法真正识别参数是否为公式。据我所知,不鼓励使用这种语法,最好使用\( \)
,但我找不到有关检测某物是否为公式的任何来源。我知道该\ifmmode
命令,但我知道这仅在公式中使用时才有效。
我对 LaTeX 中的 if/else 语法非常陌生,我不知道是否有一些命令可以解决这个问题。我知道这个命令有效,但我更喜欢一些结构良好的命令,而不是依赖于仅在$ $
使用时才有用的字符/字符串识别。
这个问题有解决办法吗?
答案1
您可以测试$...$
或\(...\)
。
\documentclass{article}
\usepackage{amsmath}
\usepackage{varwidth}
\ExplSyntaxOn
\NewDocumentCommand{\parrafo}{m}
{
\regex_match:nnTF { \A (\$|\c{\(}) (.*) (\$|\c{\)}) \Z } { #1 }
{
\mbox{#1}
}
{
\left\{
\begin{varwidth}{0.25\textwidth}
\centering\normalfont #1
\end{varwidth}
\right\}
}
}
\ExplSyntaxOff
\NewDocumentCommand{\reticulos}{mmo}{%
\begin{equation*}
\parrafo{#1} \xrightarrow{\sim} \parrafo{#2}%
\IfValueT{#3}{\xrightarrow{\sim}\parrafo{#3}}%
\end{equation*}%
}
\begin{document}
\reticulos{$E$}{text}
\reticulos{\(E\)}{This is a \\ paragraph}[$E$]
\end{document}
但我看不出与以下内容相比有任何优势。
\documentclass{article}
\usepackage{amsmath}
\usepackage{varwidth}
\NewDocumentCommand{\descset}{m}{%
\left\{%
\begin{varwidth}{0.25\textwidth}
\centering\normalfont #1
\end{varwidth}
\right\}%
}
\newcommand{\iso}{\xrightarrow{\sim}}
\begin{document}
\begin{equation*}
E \iso \descset{text}
\end{equation*}
\begin{equation*}
E \iso \descset{This is a \\ paragraph} \iso E
\end{equation*}
\end{document}
输出相同,但灵活性却大得多。