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 之间输出两个空格,但同样,我将所有这些留给读者作为练习。
- 这主要是因为 TeX 本质上是一个一次性编译系统。我们这些使用 20 世纪 70 年代至 80 年代编程语言编程的老手一定很熟悉,如果你想在声明变量或函数之前使用它,就必须进行前向声明。
- 这意味着所有这些代码都未经测试,并且可能存在拼写错误和/或缺陷。
- 我正在考虑使用 Expl3,但是我们想要的很多东西需要其他内部命令,所以我还不如
\@nameuse
使用\use:c
。 - 许多不产生输出的 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