是否可以使用 xcolor 或替代品在多列内包含多个段落?

是否可以使用 xcolor 或替代品在多列内包含多个段落?

我获得了用户在许多行、段落中写的信息,并且我必须将它们放在一个表格中,我想知道是否可以指示 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加载时,会加载该包。此包错误地重新定义了前缀。xcolortable\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

技巧解释

虽然最简单的做法是复制\multicolumn121-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。@

相关内容