人们在TeX / LaTeX中打高尔夫球有哪些技巧?请为每个答案发布一个提示,每个提示至少在某种程度上特定于TeX / LaTeX。
上下文:我注意到了这个答案,而且TeX / LaTeX没有提示问题,因此我正在创建这个。与TikZ中打高尔夫球的较窄问题提示有些重叠(因为TikZ是TeX / LaTeX之上的特定宏程序包):该问题的答案可能也适用于此,但并非相反。
人们在TeX / LaTeX中打高尔夫球有哪些技巧?请为每个答案发布一个提示,每个提示至少在某种程度上特定于TeX / LaTeX。
上下文:我注意到了这个答案,而且TeX / LaTeX没有提示问题,因此我正在创建这个。与TikZ中打高尔夫球的较窄问题提示有些重叠(因为TikZ是TeX / LaTeX之上的特定宏程序包):该问题的答案可能也适用于此,但并非相反。
Answers:
考虑内部LaTeX宏而不是文档中的宏
例如,\roman
是一个已记录的LaTeX宏,可在LaTeX计数器上使用。要42
变成XLIV
你,你必须使用类似
\newcounter{z}
\setcounter{z}{42}
\roman{z}
相反,通过查找\roman
实现方式(用于\show\roman
以交互方式获取此信息,而不是读取源文件),可以看到它是根据一个称为的有用宏来实现的\@roman
,而是直接使用该宏:
\catcode`@11
\@roman{42}
\catcode`@11
是高尔夫球的书写\makeatletter
方式(LaTeX中的简洁方式)或\catcode`\@=11
(普通TeX中的简洁方式)。一开始只需要一次,之后就可以使用包含的宏名称@
。
~
可以用作宏(其他活动字符也可以)
例
之前:
\def\a{...some definition...} ... use \a...
后:
\def~{...some definition...} ... use ~...
说明:TeX中的宏通常是“控制序列”:您可以定义\something
或\a
。但是,通过使用活动角色,您可以走得更短。默认情况下(在纯TeX / LaTeX中)存在的唯一活动字符是~
(用于“联系”,即定义为\penalty \@M \
在纯TeX中(惩罚为10000,后跟一个空格),以及\nobreakspace {}
在LaTeX中)。但是,没有什么可以阻止您根据需要进行重新定义。
此外:您可以通过将其他字符的目录代码设置为\active
(13),对其他任何字符执行相同的操作。例如,制作Z
一个活跃角色的“费用”为12个字节:\catcode`Z13
。然后,您可以Z
在任何地方简单地使用它,而不是像这样的宏\z
。对于以特殊含义开头的某些字符,直接反引号方法不起作用,您还需要一个字符:\catcode`\Z13
或\catcode90=13
。
\def
可以匹配固定模式
假设您有\def\a #1 #2 {...some definition here...}
。然后,当您\a Act42, Scene26
在宏之类的字符串上调用它时,可以在参数中将其分配为#1 <- Act42,
,#2 <- Scene26
,然后您必须做一些进一步的工作来提取相关部分。相反,可以直接写
\def\a Act#1, Scene#2 {...some definition here...}
然后像\a Act42, Scene26
直接设置#1 <- 42
和#2 <- 那样调用它26
。
(这基本上是的定义\def
,但很容易忘记,因为人们通常不会在LaTeX中执行此操作,而是喜欢将参数{}
作为函数调用传入。)
在普通TeX和LaTeX之间进行选择
关于这一点可以说很多,但简而言之,将打印“ Hello”的典型普通TeX文档与典型的LaTeX文档进行比较:
Hello
\bye
与
\documentclass{article}
\begin{document}
Hello
\end{document}
LaTeX的“成本”是显而易见的。“好处”当然是LaTeX附带了一个包含许多预编写的宏和程序包的库,其中的某些宏和程序包可能对手头的任务很有用。
\@Roman
(使大写字母在纯文本中工作会花费很多字节)-但是普通的TeX通常会更短。
如果使用LaTeX,请使用简短形式documentclass
(Chris H的想法)
而不是从典型的开始
\documentclass{article}
可以选择较短的文档类别,例如book
,甚至
\documentclass{ecv}
要么
\documentclass{tui}
article
默认情况下将其页面编号,这可以视为额外的输出。也许是元问题,以便确定应允许哪些文档类。
g.cls
这仅仅是article.cls
与\pagenumbering{gobble}
但github上是下,我不能把它现在
创建一个名为的环境将myenvironment
生成命令\myenvironment
和\endmyenvironment
。这些在内部用于开始和结束环境。在某些情况下,它们可以用作快捷方式。例如,代替
\begin{itemize}
\item abc
\end{itemize}
一个可以做
\itemize
\item abc
\enditemize
不支持,不可靠,在所有情况下都无法正常工作,自担风险等,等等。
\itemize{...}
节省更多。
您实际上可能不需要在其参数周围使用括号的某些宏,尤其是在与#1
-style参数一起在另一个宏中使用时。
如果参数中有多个标记(字符或控制序列),则大多数宏仅需要括号。
\mymacro1 % equivalent to \mymacro{1}
\mymacro{12} % equivalent to \mymacro{12}
\mymacro a % equivalent to \mymacro{a}
\mymacro{ab} % equivalent to \mymacro{ab}
\mymacro\foo % equivalent to \mymacro{\foo}
\mymacro{\foo x} % equivalent to \mymacro{\foo x}
如果您需要多次使用长名称使用同一宏,则可以使用\let
它定义一个较短的别名。
\let\a\mymacrowithalongname
\a{foo}\a{bar}\a{qux}
\def\a{\mymacrowithalongname}
如果您在定义中不需要多个标记,则会在上保存两个字节。
除了宏名,您可以使用活动字符来保存反斜杠。
请注意,\let
这不仅适用于宏名称,而且适用于内置基元。例如,如果您\ifnum ... \fi
在代码中使用了大量构造,那么定义\let\i\ifnum
和使用\i ... \fi
可以节省一些字节。甚至可以\let
自己使用:\let\l\let
。
明智地使用本地{
... }
小组
如该答案所指出的,活动字符(例如)~
可以用作宏名称。不幸的是,~
默认情况下,它是唯一的活动字符,而更改另一个字符的猫码非常昂贵:\catcode`!13
需要12个字节。如果仅在代码的一小部分区域中需要新的宏定义,则可以使用本地组。
当TeX输入由打开的新本地组时{
,它将在内部保存堆栈上创建新的分组级别。这意味着将保存所有当前的宏和寄存器。\global
现在,对它们的任何修改(除非明确标记为)都将处于活动状态,直到该组被结束为止}
。这意味着~
可以在组中重新定义,然后与新定义一起使用,并且在组完成后将自动恢复旧的定义。
这是一个例子:
\def~{abc}
~ -- {\def~{123}~} -- ~
这个输出
abc-123-abc
这种分组机制的一个有趣的副作用是,旧值在组内仍然可用,直到在那里更改为止。为了说明这一点,假设我们想根据一个计数器的值打印一些字符,用最大固定长度的空格填充它们,然后继续原始的计数器值。这可以通过以下方式实现:
\newcount\x
\x=3
Print a char \the\x\ times,
{\x=-\x \advance\x 10 pad with \the\x\ spaces,}
and go on with x=\the\x.
哪个输出
打印一个字符3次,用7个空格填充,然后以x = 3继续。
如果要使用TeX的标准宏来循环\loop ... \repeat
嵌套,此分组行为尤其重要。这些宏定义内部命令,并使用它们来确定如何继续。嵌套它们而不将内循环放在花括号中会混淆内部命令并导致意外的行为。
柜台的发展,例如
\advance\u by 1
\multiply\u by 3
\divide\u by 2
也可以
\advance\u1 % \u = \u + 1
\advance\u-1 % \u = \u - 1
\multiply\u3 % \u = \u * 3
\multiply\u\u % \u = \u * \u
\divide\u2 % \u = \u / 2
相同的原理也适用于初始化:
\newcount\u\u1
将计数器\ u设置为1。
请注意,它们确实需要在它们后跟一个空格字符(换行符或空格)(或一个\relax
,但空格也是如此),因此下一个命令将不会被忽略。例如,
\u1\the\u
不打印\ u,但忽略\the
命令。