我正在尝试为表头定义一个宏,但不幸的是,我远不是 TeX 专家。我应该拆分一个用 & 符号分隔的列表,格式化条目,然后再次用 & 符号连接它。拆分列表有效,但我无法用 & 符号连接它。
\documentclass{article}
\usepackage{xstring}
\newcommand{\DLbase}[1]% #1 = comma delimited keywords
{{\saveexpandmode\expandarg%
\StrCut{\noexpand#1}{&}\DLleft\DLright%
\loop% extract keywords from list
\StrCut{\DLright}{&}\DLnext\DLright%
\textbf\DLleft\DLsep%
\edef\DLleft{\DLnext}%
\if\DLright\relax\else\repeat%
\textbf{\DLleft}%
\restoreexpandmode}}
\newcommand{\tabhead}[1]{\def\DLsep{&}\DLbase{#1}\\}
\begin{document}
\begin{table}[ht]
\begin{center}
\caption{Command / Purposes}
\begin{tabular}{|p{0.3\textwidth}|p{0.6\textwidth}|}
\hline
\tabhead{Command & Purpose}
\hline
cd & change directory \\
rm & remove files
\hline
\end{tabular}
\end{center}
\end{table}
\end{document}
我该如何定义它\DLbase
并且\DLsep
确保它有效?
答案1
问题始终是在 TeX “看到” 之前输出所有行&
。使用 很容易expl3
,使用 可以\seq_use:Nn
“立即”提供其结果。
该\tabhead
命令具有用于格式化命令的可选参数 default \bfseries
。它在 处拆分其参数&
,然后在项目前添加可选参数,用 将它们分开&
,并在后面加上\\
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\tabhead}{ O{\bfseries} m }
{
\seq_set_split:Nnn \l_tmpa_seq { & } { #2 }
#1 \seq_use:Nn \l_tmpa_seq { & #1 } \\
}
\ExplSyntaxOff
\begin{document}
\begin{table}[htp]
\centering
\caption{Command / Purposes}
\begin{tabular}{|p{0.3\textwidth}|p{0.6\textwidth}|}
\hline
\tabhead{Command & Purpose}
\hline
cd & change directory \\
rm & remove files \\
\hline
\end{tabular}
\bigskip
\begin{tabular}{|p{0.3\textwidth}|p{0.6\textwidth}|}
\hline
\tabhead[\itshape]{Command & Purpose}
\hline
cd & change directory \\
rm & remove files \\
\hline
\end{tabular}
\end{table}
\end{document}
答案2
而不是使用xstring
我建议解析\SplitList
或 等软件包\SplitArgument
来执行此操作。由于这些命令似乎不能很好地与 & 符号配合使用(我确信可以通过使用类别代码来解决这个问题),我已将其更改\tabhead
为期望命令分隔列表:
\documentclass{article}
\usepackage{xparse}
% typeset an entry of the header
\newcommand\MakeEntry[1]{\headersep#1\def\headersep{&}}
\DeclareDocumentCommand\tabhead{ > { \SplitList{,}} m }
{\let\headersep\relax% no & needed for first column
\ProcessList{#1}{\MakeEntry}\relax\\%
}
\begin{document}
\begin{tabular}{|p{0.3\textwidth}|p{0.6\textwidth}|}
\hline
\tabhead{Command, Purpose}
\hline
cd & change directory \\
rm & remove files\\
\hline
\end{tabular}
\end{document}
我删除了center
和table
环境,因为它们对于 MWE 来说不是必需的。这会产生预期的输出:
\tabhead
在的定义中,>
将“输入”视为逗号分隔的列表,然后将其条目传递给\MakeEntry
。\ProcessList
该\headersep
宏用于&
在除第一个之外的每个标题项之前添加分隔符。