我想仅使用命令填充表格的单元格\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}