在命令参数中保留制表符和换行符

在命令参数中保留制表符和换行符

问题Tab 不是额外的对齐标签我设法在数组(或表格)环境中使用制表符作为列分隔符“&”并将换行符用作换行符“\\”,其工作符合预期。

现在我想将此环境包装在命令中,但似乎所有制表符和换行符都从表主体中删除了。有没有办法保留这些控制字符?

梅威瑟:

\documentclass{article}

\makeatletter%
  \begingroup%
    \gdef\activateCtrlChars{%
      \catcode`\^^I=\active%
      \catcode`\^^M=\active%
    }%
    \activateCtrlChars%
    \gdef^^I{\@ifnextchar^^I{}{&}}%
    \gdef^^M{\@ifnextchar\end {}{\\}}%
    \gdef\gobbleLineBreak{\@ifnextchar^^M {\@gobble}{}}%
  \endgroup%
\makeatother%    

\newenvironment{myArray}
{% before
  \activateCtrlChars%
  \array[t]{ccc}%
    \gobbleLineBreak%
}
{% after
  \endarray%
  \par%
}

\newcommand{\myArrayAsCmd}[1]{\begin{myArray}#1\end{myArray}}

\begin{document}

Environment:
\begin{myArray}
a   b   c
aa  bb  cc
\end{myArray}

Command:
\myArrayAsCmd{
a   b   c
aa  bb  cc
}

\end{document}

输出:

MWE 输出

答案1

全局重新定义 active^^M不是一个好主意。以下代码可以避免这种情况。关于您的问题:您需要在获取参数之前更改类别代码。

最后评论:这似乎很方便。但它很脆弱,而且依赖于编辑器(例如,有些编辑器会将 TAB 字符标准化为空格)。你收获甚微,却冒着失去很多的风险。不要这么做。

\documentclass{article}

\makeatletter
\def\activateCtrlChars{%
  \catcode`\^^I=\active
  \catcode`\^^M=\active
  \begingroup\lccode`~=`\^^I\lowercase{\endgroup\def~}{&}%
  \begingroup\lccode`~=`\^^M\lowercase{\endgroup\def~}{\\}%
}
\begingroup
\obeylines
\gdef\gobbleLineBreak{\@ifnextchar^^M{\@gobble}{}}%
\endgroup%
\makeatother

\newenvironment{myArray}
 {%before
  \activateCtrlChars
  \array[t]{ccc}\gobbleLineBreak
 }
 {% after
  \endarray
 }

\newcommand{\myArrayAsCmd}{%
  \begingroup\activateCtrlChars\begin{myArray}\fetchArg
}
\newcommand\fetchArg[1]{\gobbleLineBreak#1\end{myArray}\endgroup}

\begin{document}

Environment:
\begin{myArray}
a   b   c
aa  bb  cc
\end{myArray}

Command:
\myArrayAsCmd{
a   b   c
aa  bb  cc
}

\end{document}

在此处输入图片描述

相关内容