新命令中的 & 符号,表格环境

新命令中的 & 符号,表格环境

我正在尝试为表头定义一个宏,但不幸的是,我远不是 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}

我删除了centertable环境,因为它们对于 MWE 来说不是必需的。这会产生预期的输出:

在此处输入图片描述

\tabhead在的定义中,>将“输入”视为逗号分隔的列表,然后将其条目传递给\MakeEntry\ProcessList\headersep宏用于&在除第一个之外的每个标题项之前添加分隔符。

相关内容