检测传递给命令的参数是否是数学公式

检测传递给命令的参数是否是数学公式

我正在定义一个命令,用于显示带括号的段落及其之间的同构,但我希望该命令能够识别其中一个段落是否是纯数学内容,因此不显示花括号。让我详细说明一下。

我的第一次尝试纯粹是面向段落的。我创建了一个命令来为段落赋予形状(使用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}

输出相同,但灵活性却大得多。

相关内容