单列多列环境

单列多列环境

我正在编写一些程序xsl,它接受xml源并输出.tex文件。源有一个元素,该元素通常成为输出multicols中的环境.tex,并且它有一个cols属性来指定有多少列。

如果未指定任何属性,我希望默认值为一列cols。但看起来\begin{multicols}{1}仍然会产生两列输出。我可以xsl按大小写方式编写,并在未指定(或指定为)multicols时完全跳过环境,但为了保持一致性,我宁愿不这样做。cols1

有没有什么 LaTeX 方法可以让multicols环境产生单列输出?

答案1

这个解决方案是受 Werner 启发的,但它支持可选参数\begin{multicols},更重要的是,它不会一次性收集所有内容,如果可能的话,最好避免这种情况。它也不需要更改环境的名称。

\documentclass{article}
\usepackage{multicol,lipsum,xparse}

\let\multicolmulticols\multicols
\let\endmulticolmulticols\endmulticols

\RenewDocumentEnvironment{multicols}{mO{}}
 {%
  \ifnum#1=1
    #2%
  \else % More than 1 column
    \multicolmulticols{#1}[#2]
  \fi
 }
 {%
  \ifnum#1=1
  \else % More than 1 column
    \endmulticolmulticols
  \fi
 }

\begin{document}

\begin{multicols}{2}[\section{Title in single column}]
\lipsum[1-2]
\end{multicols}

\begin{multicols}{1}
\lipsum[1-2]
\end{multicols}

\end{document}

在此处输入图片描述

答案2

您可以使用替代环境,该环境取决于您管理的是单个列还是多个列:

在此处输入图片描述

\documentclass{article}
\usepackage{multicol,lipsum,environ}

\NewEnviron{auxmulticols}[1]{%
  \ifnum#1<2\relax% Fewer than 2 columns
    %\vspace{-\baselineskip}% Possible vertical correction
    \BODY
  \else% More than 1 column
    \begin{multicols}{#1}
      \BODY
    \end{multicols}%
  \fi
}

\begin{document}

\begin{auxmulticols}{2}
\lipsum[1-2]
\end{auxmulticols}

\begin{auxmulticols}{1}
\lipsum[1-2]
\end{auxmulticols}

\end{document}

multicol需要捕获环境的结尾,以便判断multicols文本的结尾。将其包装在一个新的环境中,该环境将捕获整个内容(例如,\BODY使用environ) 允许您在处理输出之前对某些参数进行条件处理。

答案3

为什么不直接使用:

\documentclass{article}
\usepackage{multicol,lipsum,environ}    

\begin{document}

\begin{multicols}{2}

your 2 columns text

\end{multicols}

your 1 column text

\end{document}

在此处输入图片描述

相关内容