我无法控制的工具产生以下输出:
\[\mForall{v1 v2 v3 : \mNat{} \mPlus{} \mQuot{}}{a \mLt{} b \mAnd{} b \mLt{} c \mImpl{} a \mLt{} c}\]
我所能做的就是重新定义\m...
宏。最终目标是得到类似于以下内容的结果:
forall a \, b \, c \: : \: \mathbb{N} + \mathbb{Q} : ... . \: a < b \wedge b < c \implies a < c
除了一件事之外,所有这些都很容易: 中的间距\mForall
。我想我需要将它的第一个参数拆分在冒号周围,并用细数学空格替换前半部分的空格,而后半部分保持不变。
我可以使用 pdfLaTeX 轻松实现这一点吗?
答案1
\documentclass{article}
\usepackage{amsmath,amsfonts}
%[1] to remove spurious {}
\newcommand{\mNat}[1]{\mathbb{N}}
\newcommand{\mPlus}[1]{+}
\newcommand{\mQuot}[1]{\mathbb{Q}}
\newcommand{\mLt}[1]{<}
\newcommand{\mAnd}[1]{\land}
\newcommand{\mImpl}[1]{\Rightarrow}
\newcommand\mForall[2]{\forall #1:#2}
\begin{document}
\[\mForall{a b c : \mNat{} \mPlus{} \mQuot{}}{a \mLt{} b \mAnd{} b \mLt{} c \mImpl{} a \mLt{} c}\]
\def\mForall#1#2{\forall \xaddsp #1:#2}
\def\xaddsp#1 {%
\ifx:#1:\else
#1\,\expandafter\xaddsp
\fi}
\[\mForall{a b c : \mNat{} \mPlus{} \mQuot{}}{a \mLt{} b \mAnd{} b \mLt{} c \mImpl{} a \mLt{} c}\]
\end{document}
答案2
这是一个expl3
版本;第一个参数\mForall
在冒号处拆分,第一部分被处理为另一个序列,并\,
在每个项目之间添加。
第二部分和第二个参数只是用冒号分隔。
\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\mForall}{mm}
{
\mForallFirst{#1} : #2
}
\NewDocumentCommand{\mForallFirst}{m}
{
\seq_set_split:NVn \l_tmpa_seq \c_colon_str { #1 }
\clement_split_vars:f { \seq_item:Nn \l_tmpa_seq { 1 } }
:
\seq_item:Nn \l_tmpa_seq { 2 }
}
\cs_generate_variant:Nn \seq_set_split:Nnn { NV }
\cs_new_protected:Nn \clement_split_vars:n
{
\seq_set_split:Nnn \l_tmpb_seq { ~ } { #1 }
\forall
\seq_use:Nn \l_tmpb_seq { \, }
}
\cs_generate_variant:Nn \clement_split_vars:n { f }
\ExplSyntaxOff
\newcommand{\mNat}{\mathbb{N}}
\newcommand{\mPlus}{+}
\newcommand{\mQuot}{\mathbb{Q}}
\newcommand{\mLt}{<}
\newcommand{\mAnd}{\land}
\newcommand{\mImpl}{\Rightarrow}
\begin{document}
\[\mForall{a b c : \mNat{} \mPlus{} \mQuot{}}{a \mLt{} b \mAnd{} b \mLt{} c \mImpl{} a \mLt{} c}\]
\end{document}