我正在尝试设置 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
有多种方法可以生成条件文本:
- 使用
\ifdefined
- 使用
\newif
NewEnviron
从environ
包装中使用
要使用\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
一个可选项。\else
false
\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
。