![在自制环境中以不同的方式传递参数](https://linux22.com/image/392814/%E5%9C%A8%E8%87%AA%E5%88%B6%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BB%A5%E4%B8%8D%E5%90%8C%E7%9A%84%E6%96%B9%E5%BC%8F%E4%BC%A0%E9%80%92%E5%8F%82%E6%95%B0.png)
我想将一个参数传递给自制的表格环境,格式如下:
\begin{customTabular}{|c|c|}{'@'}
...这样第二个参数(此处'@'
,括号内)被 LaTeX 文档视为列分隔符。如何做到这一点?请在所附代码中建议更改/修改。
环境的代码customTabular
如下(这里mytabular
类似于customTabular
):
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentEnvironment {mytabular} { O{\,} }
{
\char_set_catcode_other:N \&
\char_set_catcode_alignment:n {`#1}
\begin{tabular}
}
{
\end{tabular}
}
\ExplSyntaxOff
答案1
您需要使该参数成为一个可选组(或者可能是强制的),并在用作数字之前安排删除所有引号:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentEnvironment {mytabular} { O{c} m G{','} }
{
\char_set_catcode_other:N &
\char_set_catcode_alignment:n { \__mytab_test:n {#3} }
\begin{tabular}[#1]{#2}
}
{
\end{tabular}
}
\cs_new:Npn \__mytab_test:n #1 { \__mytab_test:w #1 ' #1 '' \q_stop }
\cs_new:Npn \__mytab_test:w #1 ' #2 ' #3 \q_stop { `#2 }
\ExplSyntaxOff
\begin{document}
\begin{mytabular}{cc}{'@'}
a @ b\\
c @ d
\end{mytabular}
\begin{mytabular}{cc}{@}
a @ b\\
c @ d
\end{mytabular}
\end{document}
删除标记的技巧'
在于 TeX 在匹配时是贪婪的。因此
#1 ' #2 ' #3
任何包含前导的输入'
都将有一个空的#1
,'参数' 位于 中#2
,而垃圾留在 中#3
。如果没有前导'
,则将与设置宏的结果#1
相同,该宏为输入提供附加和不附加标记。#2
'
答案2
如果你不需要引号,你的代码就可以工作,只要你使用方括号为参数。最好也为列添加强制参数。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentEnvironment {mytabular} { O{\,} m }
{
\char_set_catcode_other:N \&
\char_set_catcode_alignment:n {`#1}
\begin{tabular}{#2}
}
{
\end{tabular}
}
\ExplSyntaxOff
\begin{document}
\begin{mytabular}[@]{cc}
a @ b\\
c @ d
\end{mytabular}
\begin{mytabular}{cc}
a , b\\
c , d
\end{mytabular}
\end{document}
如果你想要这样的语法\begin{mytabular}{cc}[@]
,只需交换参数
\NewDocumentEnvironment {mytabular} { m O{\,} }
{
\char_set_catcode_other:N \&
\char_set_catcode_alignment:n {`#2}
\begin{tabular}{#1}
}
{
\end{tabular}
}