1 第一部分

1 第一部分

我想知道是否有办法定义一个命令,这样当指定一个标志时,我可以忽略标签内除文本之外的所有内容。例如,如果我有

...
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. 第 1 项
  2. 第 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

正常工作(当然,当忽略模式被禁用时,这将失败)。

相关内容