【问题标题】:Tex command which affects the next complete word影响下一个完整单词的 Tex 命令
【发布时间】:2010-03-15 13:59:39
【问题描述】:

是否有可能有一个 TeX 命令,它将整个下一个 word(或下一个字母直到但不包括下一个标点符号)作为参数,而不仅仅是下一个字母或{} 组?

我想对某些首字母缩略词使用 \caps 命令,但不想一遍又一遍地输入花括号。

【问题讨论】:

  • 如果没有那么多首字母缩写词,您可以考虑将 \caps 命令定义为 \caps{word},然后为每个命令单独设置,即 \newcommand{\NIMBY}{\caps{nimby} }
  • 我知道而且我通常会这样做,但是如果后面没有 \ 或 {},此解决方案往往会吞下空格。此外,这意味着我需要为这些词维护一个单独的列表。这可能是一个好主意,也可能不是一个好主意,具体取决于具体情况。

标签: latex tex typography


【解决方案1】:

首先创建你的命令,例如

 \def\capsimpl#1{{\sc #1}}% Your main macro

捕捉空格或标点符号的解决方案:

\catcode`\@=11  
\def\addtopunct#1{\expandafter\let\csname punct@\meaning#1\endcsname\let} 
\addtopunct{ }
\addtopunct{.}    \addtopunct{,}    \addtopunct{?} 
\addtopunct{!}    \addtopunct{;}    \addtopunct{:} 

\newtoks\capsarg
\def\caps{\capsarg{}\futurelet\punctlet\capsx}
\def\capsx{\expandafter\ifx\csname punct@\meaning\punctlet\endcsname\let
       \expandafter\capsend  
       \else \expandafter\continuecaps\fi}

\def\capsend{\expandafter\capsimpl\expandafter{\the\capsarg}}
\def\continuecaps#1{\capsarg=\expandafter{\the\capsarg#1}\futurelet\punctlet\capsx}

\catcode`\@=12

【讨论】:

    【解决方案2】:

    @Debilski - 我为我的论文中的首字母缩写词写了一些类似于你的活动 * 代码。我激活了 来打印首字母缩写词,以及第一次遇到的扩展名。我还通过允许定义内联扩展并使用 .aux 文件将扩展“及时”发送(如果在声明之前使用它们)或者如果是首字母缩略词则报告错误,这也有点离题了从未声明过。

    总的来说,当时这似乎是一个好主意——我很少需要在我的实际文本中将 非常要小心激活甚至远程常用的字符。

    另一方面,使用 XeTeX 和更高的 unicode 字符,它可能更安全,并且通常有一些简单的方法可以输入这些额外的字符,例如制作一个多(或组合)键(我通常映射 numlock 或Windows 键之一),例如多-!-!产生¡)。或者,如果您在 emacs 中运行,您可以使用 C-\ 短暂切换到 TeX 输入模式,通过为其键入 TeX 命令来插入 unicode(尽管这对于实际键入 TeX 文档来说很痛苦,因为它会拦截您的实际 \的,请不要尝试定义自己的转义字符!)

    【讨论】:

    • 是的,我认为你是对的,这可能会在某个意想不到的时候变得非常糟糕。我一直认为,使用所有这些 markdown-to-tex 转换器,应该有可能让这样的转换器真正作为一个“简单”的 tex 包工作。我仍然认为这在某种程度上是可能的,但它给你在 tex 中的实际写作带来了很多其他的限制。 — Unicode 似乎更好,但如果你从中窃取了太多字符,你实际上是在否定 xetex 的所有优点,因为你不能再真正编写 unicode。
    • \def 很适合解析 html...
    • 差不多了。问题在于 <input type='submit' value='2>1'> 之类的东西,这是完全有效的 HTML。
    【解决方案3】:

    关于命令后的空格:参见包xspace,以及TeX FAQ 项目Commands gobble following space。

    现在为什么这很困难:正如您自己指出的那样,这样的事情似乎只能通过更改 catcode 来完成。当 TeX 读取字符时,会将 Catcodes 分配给字符,而 TeX 一次读取一行,因此您不能对同一行上的其他空格执行任何操作,恕我直言。可能有办法解决这个问题,但我看不到。


    下面有危险代码!

    此代码将在行尾执行您想要的操作首字母缩写词(以后不运行任何自动缩进),你可以使用这个:

    \def\caps{\begingroup\catcode`^^20 =11\mcaps}
    \def\mcaps#1{\def\next##1 {\sc #1##1\catcode`^^20 =10\endgroup\ }\next}
    

    【讨论】:

    • 这也不错,我想在某些时候我知道这个包的存在。
    • 我认为,可能可以使用内部宏来检查每个字符,并且根据该字母的值(或 catcode),该字母要么更改,要么宏从循环中返回。我只是做了一点实验,但我不断收到 \par 错误等。
    【解决方案4】:

    一种解决方案可能是将另一个角色设置为活动角色并使用该角色进行转义。这并没有消除对结束字符的需要,但避免了键入 \caps 宏,因此总体上更容易键入。

    因此在非常特殊的情况下,以下工作。

    \catcode`\*=\active
    \def*#1*{\textsc{\MakeTextLowercase{#1}}}
    
    Now follows an *Acronym*.
    

    不幸的是,如果没有额外的宏定义,这使得\section*{} 的使用变得不可能。

    在 Xetex 中,似乎可以为此利用 unicode 字符,因此可以定义

    \catcode`\•=\active
    \def•#1•{\textsc{\MakeTextLowercase{#1}}}
    
    Now follows an •Acronym•.
    

    这应该会减少对其他命令的影响,但当然需要将字符“•”映射到键盘的某个地方才能使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多