表格环境中 itemize 和 ifthenelse 的问题

表格环境中 itemize 和 ifthenelse 的问题

我想仅使用命令填充表格的单元格\item,并且\begin{itemize}应该自动插入。以下代码有效:

\newenvironment{matable}[0]{%
\begin{tabular}{l|p{5cm}}
theme & sujets \\ \hline\hline }
{\end{tabular}}

\newcommand{\messujets}[1]{ & \begin{itemize} #1 \end{itemize}\\ \hline}

\begin{matable}
\messujets{\item subject 1 \item subject 2}
\end{matable}

使用命令\messujets我在表格中开始新行,并用我的填充第二个单元格\item。但是,如果的参数\messujets恰好为空,LaTeX 会抱怨缺少\item。为了避免这种情况,我想\ifthenelse在单元格中进行测试。我的尝试是替换:

\begin{itemize} #1 \end{itemize}

经过

\ifthenelse{\equal{#1}{}}{\begin{itemize} #1 \end{itemize}}

因此,情况将是:

\newcommand{\messujets}[1]{ & \ifthenelse{\equal{#1}{}}{}{\begin{itemize} #1 \end{itemize}}\\ \hline}

但这会产生一个use of \@item does not match its definition我无法理解的错误......

任何想法?

答案1

问题的原因在于该\equal参数是所谓的移动参数。这意味着如果它的参数中包含易碎且不受保护的命令,它将中断\protect。并且由于可选参数\item是易碎的。

简而言之,\ifthenelse在这里使用会让你的生活变得不必要地复杂,因为你需要写类似的东西

\messujets{\protect\item subject 1 \protect\item subject 2}

因此,更好的方法是使用低级解决方案,以不扩展任何内容并中断的方式测试参数是否为空。有很多方法可以做到这一点,例如,

\ifx\foo#1\foo ...\else ... \fi

只要参数#1不以此开头,这就会起作用\foo,通过选择一些内部命令,\foo您可以确保情况确实如此。

答案2

\documentclass{article}
\newenvironment{matable}
  {\tabular{l|p{5cm}} theme & sujets \\ \hline\hline }
  {\endtabular}
\newcommand\messujets[1]{ & \ifx\relax#1\relax\else\itemize#1\enditemize\fi\\ \hline}   
\begin{document}

\begin{matable}
  \messujets{\item subject 1 \item subject 2}
  \messujets{}
  \messujets{\item subject 3 \item subject 4}
\end{matable}

\end{document}

答案3

这似乎有效,但我必须诚实地承认我真的不明白为什么。

\documentclass{article}
\newenvironment{matable}[0]{%
\begin{tabular}{l|p{5cm}}
theme & sujets \\ \hline\hline }
{\end{tabular}}
\newcommand{\messujets}[1]{&\if\noexpand#1\relax\else \begin{itemize}#1\end{itemize}\fi\\ \hline}
%
\begin{document}
\begin{matable}
\messujets{\item subject 1 \item subject 2}
\messujets{}
\messujets{\item subject 3 \item subject 4}
\end{matable}
\end{document}

答案4

与其使用,\item您还不如考虑以下第二种方案,或者使用多行包。\ifthenelse在这种情况下不起作用。我查看了跟踪文件,发现了问题所在。以下第一种方案更有可能成功,但在某些情况下仍可能失败:

第一种情况:

\documentclass{article}
\makeatletter
\def\ifnotnull#1{%
  \ifcat$\detokenize{#1}$\expandafter\@gobble\else\expandafter\@iden\fi
}
\newenvironment{mytable}
  {\tabular{l|p{5cm}} theme & subjects \\ \hline\hline }
  {\endtabular}
\newcommand\subjects[1]{ & \ifnotnull{#1}{\itemize#1\enditemize}\\ \hline}
\makeatother

\begin{document}
\begin{mytable}
  \subjects{\item subject 1 \item subject 2}
  \subjects{}
  \subjects{\item subject 3 \item subject 4}
\end{mytable}
\end{document}

第二种情况:

\documentclass{article}
\usepackage{ltxtools}[2011/12/10]
\newcount\colnum
\newcommand\generaterow[1]{%
  \colnum0
  \ltswhileexpr{\ifnum\colnum<#1\relax}{%
    &\global\advance\colnum by1 \the\colnum\relax
  }%
}

\begin{document}
\begin{tabular}{|*{4}{c|}}
  \hline
  x\generaterow{3}\\\hline
\end{tabular}
\end{document}

相关内容