问题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}
输出:
答案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}