在自制环境中以不同的方式传递参数

在自制环境中以不同的方式传递参数

我想将一个参数传递给自制的表格环境,格式如下:

\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}
  }

相关内容