\newenvironment 环境评论问题

\newenvironment 环境评论问题

我正在尝试设置 LaTeX 文档的格式(它有类回忆录),以便将来可以相当简单地添加它。

我想要的两个功能是:能够标记文本的某些部分,这样我就可以生成两个版本的输出,一个包含完整文本,另一个不包含标记的文本部分。我最初的想法是使用:

\newenvironment{\marked}{\begin{comment}}{\end{comment}}

然后将其更改为

\newenvironment{\marked}{}{}

当我需要全文时。然而,除非我在使用标记环境后添加注释块(\begin{comment}...\end{comment}),否则这将不起作用。

要有带框的文本区域。我可以使用以下方法实现此目的:

\begin{center}
    \colorbox{yellow}{
        \parbox{0.8\textwidth}{
            ...text here...
        }
    }
\end{center}

我想为此创建另一个环境,但我不确定如何去做,因为环境中包含的文本将位于开括号之间。

另外 - 我该如何在盒子内部添加填充物?

如果这些问题过于简单,我很抱歉。我之前用来格式化内容的唯一语言是 HTML 和 CSS。

答案1

回忆录类有一个专门用于此的功能:

\newcomment{marked}
\commentson{marked}
%\commentsoff{marked}

取消注释第三行即可排除所有内容marked取消注释第三行即可排除所有环境回忆录的文档。

对于彩色背景框的环境形式:

\newsavebox{\coloredbgbox}
\newenvironment{yellowbox}
  {\begin{lrbox}{\coloredbgbox}\begin{minipage}{0.8\textwidth}}
  {\end{minipage}\end{lrbox}%
   \begin{center}\colorbox{yellow}{\usebox{\coloredbgbox}}\end{center}}

有了这个定义,你可以写

\begin{yellowbox}
Text to be produced on a yellow background as wide as 80\%
of the normal line width.
\end{yellowbox}

不过,最好将不同的主题分成不同的问题。

答案2

有多种方法可以生成条件文本:

  1. 使用\ifdefined
  2. 使用\newif
  3. NewEnvironenviron包装中使用

要使用\ifdefined\def请确保条件宏已定义。然后,当您不想要条件文本时,只需注释掉以下行\def\DisplayMarked{}

\documentclass{article}
\def\DisplayMarked{}% Comment this to remove "...marked text..."

\begin{document}
Comment \textbackslash def to remove:
\ifdefined\DisplayMarked
   .. marked text...
\fi
\end{document}

正如 Martin 指出的那样,您还可以使用\newif\ifDisplayMarked来定义条件。然后,您可以将此条件设置为 ,true并将\DisplayMarkedtrue设置为 false \DisplayMarkedfalse。要使用此条件,请使用\ifDisplayMarked并以 结尾该子句。如果您想要为该案例执行其他操作,则可以在此处放入\fi一个可选项。\elsefalse

\documentclass{article}
\newif\ifDisplayMarked%
\DisplayMarkedtrue%
%\DisplayMarkedfalse% Un-comment out to remove "...more text..."

\begin{document}
Un-comment \textbackslash DisplayMarkedfalse to remove:
\ifDisplayMarked
   .. more text...
\fi
\end{document}

如果你真的想要一个这样的环境,一个简单的方法是使用NewEnviron使用environ它可让您将其用于\BODY环境主体。

\documentclass{article}
\usepackage{environ}

\NewEnviron{Marked}{%
    \BODY% Comment this to remove `...more marked tex...`
}%

\begin{document}
Comment \textbackslash BODY to remove:
\begin{Marked}
   .. more marked text...
\end{Marked}
\end{document}

带框的文本区域:

至于您的第二个问题,这很简单,只需使用#1,它代表宏的第一个参数。

\documentclass{article}
\usepackage{xcolor}

\newcommand{\MyBox}[1]{
\begin{center}%
    \colorbox{yellow}{%
        \parbox{0.8\linewidth}{%
            #1%
        }%
    }%
\end{center}%
}%

\begin{document}
\MyBox{...text here...}
\end{document}

答案3

环境comment使用逐字模式跳过其区域,因此无法以正常方式嵌套。正如 egreg 已经指出的那样,有特定的宏可以将环境定义为注释。

这是我的解决方案,说实话,它与 egreg 的解决方案非常相似,但使用我的adjustbox包来格式化环境。在我看来,它更方便用户使用。内部功能与 egreg 的代码大致相同。它还显示了其他类所需的代码,以防其他人需要与普通 LaTeX 类类似的代码。

\documentclass{memoir}
\usepackage{xcolor}
\usepackage{adjustbox}

\newenvironment{marked}{%
    \begin{adjustbox}{minipage=0.8\textwidth,cfbox=yellow,env=center}
}{%
    \end{adjustbox}
}

%% Uncomment to make 'marked' environments disappear. (memoir)
%\newcomment{marked}
%\commentson{marked}

%% Alternative for other classes
% \usepackage{comment}
% \includecomment{marked}
% \let\endmarked\relax

\begin{document}

Some text.
\begin{marked}
test
\end{marked}
Some other text.

\end{document}

答案4

按照 Peter Grill 的建议,只需使用该environ包并定义一个布尔值即可

\newif\ifcomm\commtrue

准备好您的环境

\NewEnviron{marked}{\ifcomm\BODY\fi}

因此,你可以将其放入文本中

\begin{marked} (stuff) \end{marked}

\commtrue并使用或进行调整\commfalse

相关内容