如何在 `align` 环境中以不同于平常的方式使用 &?

如何在 `align` 环境中以不同于平常的方式使用 &?

我正在尝试编写一个宏,以便能够以更自然的语法编写逻辑公式。我已想出一个可行的版本,但在align环境内部(以及环境中tabular)使用时会出现问题。

这是代码:

\documentclass{article}

\usepackage{amsmath}
\usepackage{amssymb}% for \Box
\usepackage{xparse}
\usepackage{xstring}
\usepackage{pgffor}

\makeatletter
\NewDocumentCommand\logic{m}{%
  \def\@formula{#1}%
  \saveexpandmode
  \expandarg
  \foreach \keyword/\operator in \@operators {%
    \StrSubstitute{\@formula}{\keyword}{\operator}[\@temp]%
    \global\let\@formula\@temp
  }%
  \restoreexpandmode
  \@formula
}

% Here the list of recognised syntax with the corresponding commands
\def\@operators{
  []/\Box,
  <>/\Diamond,
  !/\neg,
  &&/\land,
  ||/\lor,
  <->/\leftrightarrow,
  ->/\rightarrow,
  <-/\leftarrow
}
\makeatother

\begin{document}

Here is a valid modal logic formula: $\logic{[]p -> p && <>[]p}$

This is a display modal logic formula:
\begin{align}
 \logic{[]p -> p && <>[]p}
\end{align}

\end{document}

如果我评论第二段,则输出如下:

输出

然而,环境内使用的相同宏align却完全失灵了,产生了数百条错误消息。

我预计&在 中使用具有特殊含义的活动字符时会出现问题align。我猜问题是align预先将行的内容分成两部分,\logic{[]p -> p<>[]p},然后导致所有麻烦。对吗?

事实上,如果我避免&在公式中使用注释掉以下&&/\land@operators宏中,宏在内部align也起作用。

请注意,在 中一切都能正常工作equation,使用&也是如此。

有没有办法让这段代码在内部运行align?或者有没有办法实现与内部运行相同的结果align

答案1

我将定义括\logic在了额外的括号中。

根据让信息进入或离开边界的需求\logic,可以使用替代的“括号黑客”来代替额外的括号。参见了解牙套使用技巧。例如,\DeclareDocumentCommand\logic{m}{\iffalse{\fi...\iffalse}\fi}也可以,加上可以让公式被数学包围,并且二进制/一元信息可以跨边界传输。更多信息请参见补充

\documentclass{article}

\usepackage{amsmath}% for `align`
\usepackage{latexsym}% for \Box
\usepackage{xparse}
\usepackage{xstring}
\usepackage{pgffor}

\makeatletter
\DeclareDocumentCommand\logic{m}{{%
  \gdef\@formula{#1}%
  \saveexpandmode
  \expandarg
  \foreach \keyword/\operator in \@operators {%
    \StrSubstitute{\@formula}{\keyword}{\operator}[\@temp]%
    \global\let\@formula\@temp
  }%
  \restoreexpandmode
  \@formula
}}

% Here the list of recognised syntax with the corresponding commands
\def\@operators{
  []/\Box,
  <>/\Diamond,
  !/\neg,
  &&/\land,
  ||/\lor,
  <->/\longleftrightarrow,
  ->/\longrightarrow,
  <-/\longleftarrow
}
\makeatother

\begin{document}

Here is a valid modal logic formula: $\logic{[]p -> p && <>[]p}$

This is a display modal logic formula:
\begin{align}
 \logic{[]p -> p && <>[]p}
\end{align}

\end{document}

在此处输入图片描述


补充:支撑技巧

以下是括号破解如何产生影响的一个例子。比较两种情况,第一种情况是使用额外的括号,第二种情况是使用括号破解。在第二种情况下,的二进制性质+与之前的进行通信y,以在 周围提供适当的间距+

\documentclass{article}

\usepackage{amsmath}% for `align`
\usepackage{latexsym}% for \Box
\usepackage{xparse}
\usepackage{xstring}
\usepackage{pgffor}

\makeatletter
\DeclareDocumentCommand\logic{m}{{%
  \gdef\@formula{#1}%
  \saveexpandmode
  \expandarg
  \foreach \keyword/\operator in \@operators {%
    \StrSubstitute{\@formula}{\keyword}{\operator}[\@temp]%
    \global\let\@formula\@temp
  }%
  \restoreexpandmode
  \@formula
}}

% Here the list of recognised syntax with the corresponding commands
\def\@operators{
  []/\Box,
  <>/\Diamond,
  !/\neg,
  &&/\land,
  ||/\lor,
  <->/\longleftrightarrow,
  ->/\longrightarrow,
  <-/\longleftarrow
}
\makeatother

\begin{document}

Here is a valid modal logic formula: $\logic{[]p -> p && <>[]p}$

This is a display modal logic formula:
\begin{align}
 y \logic{+ []p -> p && <>[]p}
\end{align}
\makeatletter
\DeclareDocumentCommand\logic{m}{\iffalse{\fi%
  \gdef\@formula{#1}%
  \saveexpandmode
  \expandarg
  \foreach \keyword/\operator in \@operators {%
    \StrSubstitute{\@formula}{\keyword}{\operator}[\@temp]%
    \global\let\@formula\@temp
  }%
  \restoreexpandmode
  \@formula
\iffalse}\fi}

\begin{align}
 y\logic{+ []p -> p && <>[]p}
\end{align}
\end{document}

在此处输入图片描述

答案2

您可以充分利用 的功能expl3

\documentclass{article}

\usepackage{amsmath}
\usepackage{amssymb}% for \Box
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand\logic{m}
 {
  \group_align_safe_begin:
  \tl_set:Nn \l_gigabytes_logic_input_tl { #1 }
  \clist_map_function:NN \c_gigabytes_logic_subs_clist \gigabytes_logic_sub:n
  \tl_use:N \l_gigabytes_logic_input_tl
  \group_align_safe_end:
 }
\tl_new:N \l_gigabytes_logic_input_tl
\clist_const:Nn \c_gigabytes_logic_subs_clist
 {
  []/\Box,
  <>/\Diamond,
  !/\neg,
  &&/\land,
  ||/\lor,
  <->/\longleftrightarrow,
  ->/\rightarrow,
  <-/\leftarrow
 }
\cs_new_protected:Nn \gigabytes_logic_sub:n
 {
  \__gigabytes_logic_sub:w #1 \q_stop
 }
\cs_new_protected:Npn \__gigabytes_logic_sub:w #1 / #2 \q_stop
 {
  \tl_replace_all:Nnn \l_gigabytes_logic_input_tl { #1 } { #2 }
 }
\ExplSyntaxOff

\begin{document}

Here is a valid modal logic formula: $\logic{[]p -> p && <>[]p}$

This is a display modal logic formula:
\begin{align}
\logic{[]p -> p && <>[]p}
\end{align}

\end{document}

注意事项:

  1. 通过使用和&来隐藏令牌align\group_align_safe_begin:\group_align_safe_end:
  2. 替换过程更加简单,无需调整扩展模式

在此处输入图片描述

相关内容