LaTeX 中有占位符吗?

LaTeX 中有占位符吗?

LaTeX 中是否存在以下形式的占位符:

A horse is \placeholder able to fly.

\placeholdertext{not}

它应该产生如下输出:

A horse is not able to fly.

因此我寻找一个可以与任意内容一起使用的\footnotemark和的类似物。\footnotetext

marginpar例如,当我想在一段文字中解释一些简单术语并tikz在旁边附上一张复杂图片时,我会将其与 结合使用:

Some long paragraph in which I mention some term\marginpar{\placeholder} that I want to explain on the side.

\placeholdertext{
    \begin{tikzpicture}
    % Picture for a better understanding of the used term.
    \end{tikzpicture}
}

Another paragraph with some term\marginpar{\placeholder} that I want to explain.

\placeholdertext{
    Some informative text...
}

答案1

您可以使用todonotes包来插入不在边缘的地方:

\documentclass{article}
\usepackage{todonotes}

\begin{document}
A horse is \todo{not} able to fly.
\end{document}

答案2

从评论中的讨论来看,似乎需要的是定义占位符的能力它被使用了。

首先,简要说明一下:原始发帖者谈到了\footnotemark在段落中使用,然后\footnotetext在段落末尾使用,以在源代码中保持美观。这是一个坏的这个想法。一方面,不能保证和\footnotetext\footnotemark在同一页上。另一方面,如果一个段落中有多个脚注,该计划就会失败(在这种情况下,footnote需要手动调整计数器,以便脚注文本具有正确的数字)。

也就是说,由于 LaTeX 解释其输入的方式,我们通常无法在使用后定义某些东西。¹解决这个问题的方法是利用 LaTeX 用于处理其他前向定义的机制,即文件.aux

因此,我们希望能够做类似以下的事情:

A horse is \PH{horse} able to fly.

\SetPlaceholder{horse}{not}

由于我是凭空想出来的²,我将省略诸如未定义占位符或重新定义占位符的警告之类的细节。我将把它留给读者作为练习。

定义\PH会相对简单。它只会查找PH@name以给name定名称命名的命令并将其用于输出。我将在这里使用一些内部 LaTeX 命令³,因此我们需要从

\makeatletter

然后定义\PH为:

\NewDocumentCommand{\PH}{ m }
   {\@nameuse{#1}}

占位符的定义如下:

\NewDocumentCommand{\DefinePlaceHolder}{ m m }
   {\@namedef{#1}{#2}}

你可能会想,等一下,我们不是要定义吗\SetPlaceHolder?这是什么\DefinePlaceHolder

这是将写入文件.aux以创建占位符的命令。因此我们将其定义\SetPlaceHolder为:

\NewDocumentCommand{\SetPlaceHolder}{ m m }
   {\@bsphack % ❶
    \protected@write\@auxout{}% ❷
     {\string\DefinePlaceHolder % ❸
        {#1}{#2}}%
    \@esphack % ❶
   }

这里有几点需要注意:序列\@bsphack...\@esphack表示\SetPlaceHolder如果它出现在段落中间,则不会导致输出中产生额外的空格。⁴我们使用将\protected@write输出写入辅助文件 ❷。这将扩展任何未受保护的宏,\protect尽管我们可以通过使用 ❸ 获得与此处相同的效果\string 。

此代码还有许多改进空间。我建议执行texdoc source2e并跳转到文件 F,其中记录了交叉引用代码的工作原理。如果您想要空占位符的可能性,那么会有一些挑战,因为否则foo \PH{bar} bam如果占位符为空,则会在 foo 和 bam 之间输出两个空格,但同样,我将所有这些留给读者作为练习。


  1. 这主要是因为 TeX 本质上是一个一次性编译系统。我们这些使用 20 世纪 70 年代至 80 年代编程语言编程的老手一定很熟悉,如果你想在声明变量或函数之前使用它,就必须进行前向声明。
  2. 这意味着所有这些代码都未经测试,并且可能存在拼写错误和/或缺陷。
  3. 我正在考虑使用 Expl3,但是我们想要的很多东西需要其他内部命令,所以我还不如\@nameuse使用\use:c
  4. 许多不产生输出的 LaTeX 命令都使用此功能,所涉及的代码相当有趣。除其他事项外,它还将确保您在编写以下代码时仍能获得句末空格,例如,但foo.\label{bar} And more…有一个问题是,如果您有一个sphack在段落末尾使用该机制的命令,它可以在那里产生一个空格,否则该空格不会输出,这在某些罕见情况下会导致段落末尾出现空白行。

答案3

当然,(La)TeX 中有“占位符”——“每个”宏都是一个占位符,它将被扩展为其含义(或是一个执行不同操作的原语)

xspace包只是为了宏后的正确间距,但有些人会对此不以为然。

现在的问题是:使用这些占位符是否值得?答案是,不值得。

在我看来,最好使用glossary,例如glossaries包。

\documentclass[a4paper]{scrartcl}

\usepackage{xspace}
\newcommand{\placeholder}{not\xspace}
\begin{document}

A horse is \placeholder able to fly.

\end{document}

答案4

还有skeldoc用于插入一些空白占位符的包。例如以下代码:

\documentclass{article}
\usepackage{blindtext}
\usepackage{skeldoc}
\begin{document}
\section{My section}
\skelline
\Blindtext[1]
\skelpar[4]
\Blindtext[1]
\section{\skelline}
\Blindtext[1]
\end{document}

将生成以下文档: 在此处输入图片描述

文档中的更多信息和示例:https://github.com/mlhetland/skeldoc.sty

相关内容