\renewcommand 或 \renewenvironment 带有多列

\renewcommand 或 \renewenvironment 带有多列

multicolumn每次我开始一个新的小节时,我都会尝试在我的环境中创建一个水平的白色空间。

它让人们不必在页面上的不同内容之间来回寻找,而是以更易读的方式分割页面。

但是,我不断收到以下错误:

        ! Missing \endcsname inserted.
       <to be read again>
       \let
       l.83 \renewenvironment{\subsection}
       {\end{multicols}}{\start{multicols}{2}}
       The control sequence marked <to be read again> should
       not appear between \csname and \endcsname.

最小示例:

\documentclass[11pt]{article}
\usepackage{multicol}


%\let\origsubsection\subsection
\renewcommand{\subsection}{\end{multicols}\subsection\start{multicols}{2}}

\begin{document}

\section{Something here}
Filler text1

\begin{multicols}{2}

\subsection{This is a test1}  %\endMulti startsub  \beginMulti
Filler text2
\subsection{This is a test2}  %\endMulti startsub  \beginMulti
Filler text3

\end{multicols}
\end{document}

答案1

您已经\subsection根据自身定义了一个无限循环,但您还使用了\start未定义的命令。您的意图更像这样:

\documentclass[11pt]{article}
\usepackage{multicol}


\let\origsubsection\subsection
\renewcommand{\subsection}[1]{\end{multicols}\origsubsection{#1}\begin{multicols}{2}}

\begin{document}

\section{Something here}
Filler text1

\begin{multicols}{2}

\subsection{This is a test1}  %\endMulti startsub  \beginMulti
Filler text2
\subsection{This is a test2}  %\endMulti startsub  \beginMulti
Filler text3

\end{multicols}
\end{document}

答案2

想法与其他答案相同,但是,添加了对带星号的变量和可选参数的支持:

\makeatletter
\let\subsection@old\subsection
\def\subsection@pre{\end{multicols}}
\def\subsection@post{\begin{multicols}{2}}
\newcommand\subsection{\@ifnextchar*\subsection@star\subsection@nostar}
\def\subsection@star*#1{\subsection@pre\old@subsection*{#1}\subsection@post}
\def\subsection@nostar{\@ifnextchar[\subsection@br\subsection@nobr}
\def\subsection@br[#1]#2{\subsection@pre\old@subsection[#1]{#2}\subsection@post}
\def\subsection@nobr#1{\subsection@pre\old@subsection{#1}\subsection@post}
\makeatother

抱歉,代码有点神秘,我不喜欢使用\@dblarg\@ifstar

答案3

在此处输入图片描述

这是你想要的吗?!我希望如此。如果你还想更改之前的间距sectionsubsection检查这个答案

我假设您有一篇文章(但没有任何章节)。我还假设您希望整个内容都是,并在每次执行和命令twocolumn时停止。sectionsubsection

我使用了宏调用和,而不是\begin{multicols}和符号。\end{multicols}\multicols\endmulticols

\documentclass[11pt]{article}

\usepackage{lipsum} % demo only

\usepackage{multicol}

\AtBeginDocument{\begin{multicols}{2}}
\AtEndDocument{\end{multicols}}

\makeatletter
\let\section@orig\section
\let\subsection@orig\subsection
\renewcommand\section[1]{\endmulticols\section@orig{#1}\multicols{2}}
\renewcommand\subsection[1]{\endmulticols\subsection@orig{#1}\multicols{2}}
\makeatother

\begin{document}

\show\section
\show\subsection

\section{Section}

\lipsum[1]

\subsection{Subsection}

\lipsum[2]

\subsection{Subsection}

\lipsum[3]

\section{Section}

\lipsum[4]

\subsection{Subsection}

\lipsum[5]

\subsection{Subsection}

\lipsum[6]

\end{document}

注意:lipsum仅存在于演示文本中。

我也尝试过使用xpatch,但是我并没有解决问题,反而制造了问题……这是部分代码。我不知道如何修复这个问题……\protect除了消除错误之外,似乎没有解决任何问题……相关主题:脆弱命令和坚固命令之间有什么区别?

\documentclass[11pt]{article}

\usepackage{lipsum} % demo only

\usepackage{multicol}
\usepackage{xpatch}

\AtBeginDocument{\begin{multicols}{2}}
\AtEndDocument{\end{multicols}}

\xpretocmd{\section}{\endmulticols}{}{}
\xapptocmd{\section}{\protect\multicols{2}}{}{}
\xpretocmd{\subsection}{\endmulticols}{}{}
\xapptocmd{\subsection}{\protect\multicols{2}}{}{}

\begin{document}

\section{Section}

\lipsum[1]

\subsection{Subsection}

\lipsum[2]

\subsection{Subsection}

\lipsum[3]

\section{Section}

\lipsum[4]

\subsection{Subsection}

\lipsum[5]

\subsection{Subsection}

\lipsum[6]

\end{document}

相关内容