我获得了用户在许多行、段落中写的信息,并且我必须将它们放在一个表格中,我想知道是否可以指示 LaTeX 接受一列内或多列内的段落?
如果我尝试处理这个问题
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{datetime}
\usepackage{array}
\usepackage{longtable}
\usepackage[table]{xcolor}
\usepackage{graphicx}
\usepackage[spanish]{babel}
\setlength{\parindent}{0pt}
\setlength{\parskip}{1em}
\setlength{\textwidth}{17cm}
\setlength{\textheight}{21cm}
\setlength{\columnsep}{1.5pc}
\newenvironment{rtinformation}{
\begin{longtable}{|m{7cm}|c|m{7cm}|}
}
{
\hline
\end{longtable}
}
\newcommand{\rtsingle}[1]{
\hline
\multicolumn{3}{|p{15cm}|}{#1}\\
}
\newcommand{\rttitlesubsection}[1]{
\hline
\multicolumn{3}{c}{ \bf{#1} } \\
}
\newcommand{\rtrowinfo}[2]{
\hline
#1: & & #2 \\
}
\newcommand{\rttitlesection}[1]{
\hline
\multicolumn{3}{c}{} \\
\hline
\multicolumn{3}{|>{\columncolor[rgb]{0.8,0.8,0.8}}c|}{ #1 } \\
%\multicolumn{3}{|c|}{ #1 } \\
}
\begin{document}
\begin{rtinformation}
\rttitlesection{This is my section}
\rtrowinfo{¿Ha realizado alguna gestión respecto de este predio, ante otra entidad?}{Sí}
\rttitlesubsection{Descripción de gestión:}
\rtsingle{
There are
plenty
of paragraphs, the guilty is [table]xcolor
}
\end{rtinformation}
\end{document}
我得到了错误
! Paragraph ended before \multicolumn was complete.
<to be read again>
\par
看起来好像\usepackage[table]{xcolor}
是中间的问题,有没有办法xcolor
在表格中放一些彩色行?如果我评论了包的包含和行
\multicolumn{3}{|>{\columncolor[rgb]{0.8,0.8,0.8}}c|}{ #1 } \\
\rttitlesection{This is my section}
然后 LaTeX 就可以处理很多段落了。有没有合适的替代品xcolor
?
答案1
注释于 2012 年 2 月 15 日添加
2012 年 2 月 13 日发布的1.0a 版colortbl.sty
处理并解决了该问题,使得该补丁变得多余(尽管无害)。
问题在于,当您使用选项colortbl
加载时,会加载该包。此包错误地重新定义了前缀。xcolor
table
\multicolumn
\long
xcolor
补丁是在加载(或)之后的某处在序言中写入以下魔术技巧colortbl
:
\begingroup
\toks0=\expandafter{\multicolumn{#1}{#2}{#3}}
\edef\x{\endgroup
\long\def\noexpand\multicolumn##1##2##3{\the\toks0 }}\x
这显然是 的一个 bug colortbl
。
技巧解释
虽然最简单的做法是复制\multicolumn
121-144 行中找到的 定义colortbl.sty
,并将其添加\long
到 前面\def
,但上述技巧可以达到相同的效果,而且更短。此外,即使我们colortbl.sty
进行了修改,而不仅仅是添加 ,它也能完美运行\long
。
我们需要知道\multicolumn
需要三个参数。因此,我们打开一个组,并在其中设置标记寄存器\toks0
以包含 的替换文本\multicolumn
,方法是给它提供虚拟参数。根据 TeX 的规则,符号#
是双倍的。然后我们定义\x
,\multicolumn
使用请求的\long
前缀和存储的替换文本。\endgroup
只有在 扩展时才会执行\x
,因此最终效果正是我们想要的。在技巧\show\multicolumn
展示之前
\multicolumn=macro:
#1#2#3->\multispan <...>
之后它会显示
\multicolumn=\long macro:
#1#2#3->\multispan <...>
在两种情况下,代表<...>
相同的标记列表。
另一个类似(但更复杂)的技巧可以在另一个答案
\def\longpatch#1{\expandafter\getparts\meaning#1\longpatch
\begingroup\edef#1{\long\def\noexpand#1\the\toks0 {\the\toks2}}%
\scantokens\expandafter{\expandafter\endgroup#1}}
\def\getparts#1:#2->#3\longpatch{\toks0={#2}\toks2={#3}}
\makeatletter
\longpatch\multicolumn
\makeatother
(\makeatletter
-\makeatother
对是必需的,因为在其替换文本中\multicolumn
使用了-commnds。@