![1 第一部分](https://linux22.com/image/261892/1%20%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86.png)
我想知道是否有办法定义一个命令,这样当指定一个标志时,我可以忽略标签内除文本之外的所有内容。例如,如果我有
...
This is a \dontignore{bird}.
我希望输出是“这是一只鸟。”或“鸟”,这取决于我是否切换此标志。
这可行吗?显然,将我想要的文本以外的所有内容都放在某个标签中很容易,但这似乎不太优雅。
编辑:这正是我所想的:
\documentclass{article}
\newcommand{\dontignore}[1]{...}
\begin{document}
Hello world. This is my full document with a lot of extra bells and whistles and lines. But in the end, \dontignore{this is all that matters}.
\end{document}
关闭标志后,输出应为
大家好。这是我的完整文档,包含很多额外的花哨内容和行。但最终,这才是最重要的。
否则,
这才是最重要的
理想情况下,我还可以告诉 LaTeX 不要忽略 section 和 enumerate/itemize/item 命令,如下所示
\documentclass{article}
\newcommand{\dontignore}[1]{...}
\begin{document}
\section{First part}
Hello world. This is my full document with a lot of extra bells and whistles and lines. But in the end, \dontignore{this is all that matters}.
\begin{enumerate}
\item \dontignore{Item 1}
\item Something like \dontignore{Item 2}
\end{enumerate}
\end{document}
生成所有内容(例如,将 dontignore 定义为 \newcommand{\dontignore}[1]{#1})或其他内容(使用一些标志指定部分、枚举等),如下所示
1 第一部分
这才是最重要的
- 第 1 项
- 第 2 项
答案1
接下来,你将获得上面显示的一个或另一个输出,具体取决于此行是否被注释掉
%\let\ignoreflag\relax
\documentclass{article}
\long\def\dontignore#1{#1}
\makeatletter
\long\def\ignoreflag{%
\@makeother\{%
\@makeother\}%
\xignore}
\long\def\xignore#1\dontignore#2{%
\catcode`\{\@ne
\catcode`\}\tw@
\afterassignment\xxdontignore\toks@\bgroup}
\long\def\xxdontignore{%
\the\toks@\ignoreflag}
\makeatother
%\let\ignoreflag\relax
\begin{document}
\ignoreflag
This is some text
\begin{itemize}
\item aaa
\item bbb
\item ccc \dontignore{hello }
\end{itemize}
more text
\dontignore{
\begin{enumerate}
\item this
\item that
\end{enumerate}
}
more stuff
\dontignore{\end{document}}
答案2
\documentclass{article}
\newif\ifToggle \Togglefalse % change to \Toggletrue
\makeatletter
\def\myText#1{\expandafter\myText@i#1\@nil}
\def\myText@i#1\dontignore#2\END#3\@nil{\ifToggle#1\fi#2\ifToggle#3\fi}
\makeatother
\begin{document}
\myText{%
Hello world. This is my full document with a lot of extra
bells and whistles and lines. But in the end, \dontignore this
is all that matters \END some more text.}
\end{document}
打印\Toggletrue
所有文本。
答案3
这是一个基于 LuaTeX 的解决方案(在 ConTeXt 中)
我假设内容围绕在某个环境中
\startignore
……\stopignore
使用模式(因此可以通过命令行进行控制)
在 Lua 中,吞噬
\dontignore{...}
标签之外的所有内容都是使用液相色谱解析器捕获内容\dontignore
。解析器可以{...}
正确处理嵌套。
我不知道 LuaLaTeX 中与 ConTeXt 缓冲区等效的内容,所以我不知道如何将其转换为 LuaLaTeX。
\let\dontignore\firstofoneargument
\startluacode
local lpegmatch, patterns = lpeg.match, lpeg.patterns
local P, V, Cs, C = lpeg.P, lpeg.V, lpeg.Cs, lpeg.C
local format = string.format
local backslash = P("\\")
local csname = backslash * P("dontignore")
local whitespace = lpeg.patterns.whitespace
local leftbrace = P("{")
local rightbrace = P("}")
local nonbrace = 1 - leftbrace - rightbrace
local nested = P { leftbrace * (nonbrace + V(1))^0 * rightbrace }
-- I am not sure if it makes sense to add spaces around the captured text or
-- not. Below I assume that you want spaces around the next. If not, then
-- you can just use
-- local value = P(csname * whitespace^0 * leftbrace * C((nested + nonbrace)^0) * rightbrace) / context
local value = P(csname * whitespace^0 * leftbrace * C((nested + nonbrace)^0) * rightbrace) / (function(s) context(" %s ", s) end)
local nonvalue = (1 - value)
local parser = ( (nonvalue^0 * value * nonvalue^0)^0 )
thirddata = thirddata or {}
local getcontent = buffers.getcontent
-- Function that ignores all the data except that in \dontignore
thirddata.ignoredata = function (name)
lpegmatch(parser, getcontent(name))
end
\stopluacode
\unexpanded\def\startignoring
{\grabbufferdata[ignorebuffer][startignoring][stopignoring]}
\unexpanded\def\stopignoring
{\doifmodeelse{ignore}
{\ctxlua{thirddata.ignoredata('ignorebuffer')}}
{\getbuffer[ignorebuffer]}}
可以按如下方式使用
\starttext
\enablemode[ignore]
\startignoring
\startitemize[n]
\item This is \dontignore{item 1}
\item And this is \dontignore{item 2}
\stopitemize
\stopignoring
\disablemode[ignore]
\startignoring
\startitemize[n]
\item This is \dontignore{item 1}
\item And this is \dontignore{item 2}
\stopitemize
\stopignoring
\stoptext
这使
在 Lua 中解析内容的优点是,外部的内容\dontignore
不需要是有效的 TeX 代码。因此,即使是像
\startignoring
\undefined \dontignore{Does this work}
\stopignoring
正常工作(当然,当忽略模式被禁用时,这将失败)。