我正在尝试编写一个宏,以便能够以更自然的语法编写逻辑公式。我已想出一个可行的版本,但在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}
注意事项:
- 通过使用和
&
来隐藏令牌align
\group_align_safe_begin:
\group_align_safe_end:
- 替换过程更加简单,无需调整扩展模式