我正在编写一些程序xsl
,它接受xml
源并输出.tex
文件。源有一个元素,该元素通常成为输出multicols
中的环境.tex
,并且它有一个cols
属性来指定有多少列。
如果未指定任何属性,我希望默认值为一列cols
。但看起来\begin{multicols}{1}
仍然会产生两列输出。我可以xsl
按大小写方式编写,并在未指定(或指定为)multicols
时完全跳过环境,但为了保持一致性,我宁愿不这样做。cols
1
有没有什么 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
) 允许您在处理输出之前对某些参数进行条件处理。