如何定义 \section 进行条件编译

如何定义 \section 进行条件编译

我想创建一个结构分隔符,其行为与 相同,\section但有条件地进行编译。在下面的 MWE 中,我将其标记为\draftsection。本节的内容仅应在 时进行编译\draftmodetrue。我应该如何定义\draftsection

% arara: lualatex
\documentclass[10pt,twocolumn]{book}
\usepackage[margin=0.5in,showframe]{geometry}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}

\usepackage{lipsum}


\newif\ifdraftmode
\draftmodefalse

\begin{document}
    \chapter{Apple}
        \lipsum{1-2}
    \section{Banana}
        \lipsum{2-3} % Always show this

    \draftsection{Cherry}
        %  if \draftmodefalse do not compile anything from here
        \lipsum{3-4} %(should not be shown, since \draftmodefalse)
        %  To here

         %% if \draftmodetrue, everything should compile identically to the case \draftsection were replaced by \section

    \section{Durian}
        \lipsum{4-5}  % Since this is not a draft section it should always be shown

\end{document}

我还知道我可以创建一个条件注释,如下面的代码所示:

\newif\ifdraftmode
\DeclareRobustCommand{\draftcomment}[1]{
\ifdraftmode
#1
\fi
}

我希望能够找到一个解决方案,(有效地)自动将上面}的结束括号\draftcomment放在下一节的开头。

那就是我认为我基本上想要

\draftcomment{\section {section content} }

其中 {section content} 是 Cherry 和 Durian 之间的所有内容。问题是我不知道如何让 latex{section content}自动找出它们是什么。

LaTeX 如何跟踪哪个内容在哪个章节?显然,对于方程式编号,LaTeX 会跟踪方程式出现在哪个章节中。

我通常使用 lualatex 进行编译,因此对于需要或不需要的解决方案我都可以接受。

答案1

您可以\draftsection按照以下方式定义:

\long\def\draftsection#1#2\section{%
  \section{#1}% Print regular \section{<title>} for \draftsection{<title>}
  \ifdraftmode
    #2% Only print content between \draftsection and next \section if in draft mode
  \fi
  \section% Restore captured \section for next \section
}

它的作用如下:

  • \section{<title>}只要您使用它就会打印\draftsection{<title>}(无论 的状态如何\ifdraftmode

  • 仅当 时,才会打印\draftsection{<title>}和 后续内容之间的内容。\section\draftmodetrue

  • 需要有一个明确的 \section紧随其后\draftsection{<title>}。因此,您不能将 用作\draftsection{<title>}文档的最后一节。

  • *如果您打算使用(带星号、未编号)版本,或者需要可选参数(如\draftsection[<ToC entry>]{<title>}),则需要更新定义。

相关内容