![隐藏包含铸造代码的环境](https://linux22.com/image/409893/%E9%9A%90%E8%97%8F%E5%8C%85%E5%90%AB%E9%93%B8%E9%80%A0%E4%BB%A3%E7%A0%81%E7%9A%84%E7%8E%AF%E5%A2%83.png)
任务:我想创建一个“notes”命令和一个可以用布尔标志隐藏的环境。
问题:这些“注释”可能包含minted
代码块,这些代码块会破坏之前在互联网上找到的解决方案。此外,我们希望能够在本地启用/禁用该标志。
情况:
- 我们正在创建一个包含多个子文件的文件
- 我们希望能够在单独构建子文件时设置标志
研究:
- 根据布尔值隐藏自定义环境内容
ifthen
(没有正确排除代码但允许标志的本地设置)\usepackage{ifthen} \newboolean{shownotes} % %\setboolean{shownotes}{true} \setboolean{shownotes}{false} % \newcommand{\notes}[1]{ \ifthenelse{\boolean{shownotes}}{#1}{} }
comment
(但\excludecomment{notesenv}
不起作用)和environ
(但\NewEnviron{notesenv}{\ifthenelse{\boolean{shownotes}}{\BODY}{}}
也没有起到作用)
- https://www.reddit.com/r/LaTeX/comments/1d4p2a/how_to_hide_an_environment_ie_proof/
- http://www.ryanmartinphd.com/custom-environment-in-latex-that-can-be-hidden/
- 抑制不必要的言论
目前的解决方案:到目前为止,我已经想出了这个效果很好的方法——除了我无法在本地覆盖标志。
\ifthenelse{\boolean{shownotes}}{%
\newcommand{\notes}[1]{Notes: #1}%
\newenvironment{notesenv}{Notes:}{}
}{%
\newcommand{\notes}[1]{}
\usepackage{environ}
\NewEnviron{notesenv}{} % omitting the \BODY command creates a hidden environment
}
该标志无法在本地覆盖,因为需要在定义时进行相应设置。我想我可以将定义复制到每个文件,但这真的是唯一的解决方案吗?
答案1
作为一种解决方法,您可以\inputminted
使用NewEnviron
。
例如:
\RequirePackage{environ}
\NewEnviron{hidden}[0][]{\if@hidden\else\BODY\fi}
...
\begin{hidden}
\inputminted{c}{solution.c}
\end{hidden}
答案2
此解决方案不适用于您的环境notesenv
。但对于宏,您可以使用\notes
创建一个新的条件。您可以在本地将其设置为 true 或 false。\ifincludenotes
\newif
\documentclass{standalone}
\newif\ifincludenotes
\includenotestrue
\newcommand{\notes}[1]{\ifincludenotes#1\fi}
\begin{document}
\notes{Note1}
{\includenotesfalse%
\notes{Note2}%
}
\notes{Note3}
\end{document}
答案3
我知道这是一个非常古老的问题,但由于它尚未解决,也许我找到的解决方案可以帮助那些现在阅读这个问题的人,就像我遇到的那样。
我在隐藏包含已创建内容的部分时遇到了同样的问题,这取决于在文档顶部设置的变量。我能够通过混合使用\newif
和version
包来解决这个问题。
这是我的代码:
\documentclass{article}
\usepackage{minted}
%-- Block for content hiding ---------------------------
\newif\ifxml % define the if command to use to show/hide the content
\usepackage{version}
\newenvironment{xmlsection}{}{} % create the environment that will contain the document part to show/hide
\xmltrue % set \xmlfalse to hide the XML part
\ifxml \else \excludeversion{xmlsection} \fi % the ifelse clause to show/hide the section "xmlsection"
%-- Block end -------------------------------------------
\date{}
\title{My Title}
\begin{document}
\maketitle
A sentence with \ifxml something to be shown only with xmltrue and \fi some text.
\begin{xmlsection} % the part of the document that will be shown/hidden
\section{Section with XML code}
Some text.\\
\begin{minted}[tabsize=2, fontsize=\footnotesize, breaklines, breakanywhere=false, autogobble, samepage]{XML}
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
<channel>
<!-- ... some XML tags -->
</channel>
</rss>
\end{minted}
\newpage
\end{xmlsection}
Other document sections\ldots
\end{document}
希望这可以帮助 :)