\c!...那些讨厌的、、\v!...宏是什么\e!...以及为什么 ConTeXt 要使用它们?

\c!...那些讨厌的、、\v!...宏是什么\e!...以及为什么 ConTeXt 要使用它们?

第一个例子:

\starttypescript [\s!serif] [paratype]
  \definefontsynonym [ParatypeSerif-Regular] [\s!name:PTSerif-Regular] [\s!features=\s!default]
  \definefontsynonym [ParatypeSerif-Italic] [\s!name:PTSerif-Italic] [\s!features=\s!default]
  \definefontsynonym [ParatypeSerif-Bold] [\s!name:PTSerif-Bold] [\s!features=\s!default]
  \definefontsynonym [ParatypeSerif-BoldItalic] [\s!name:PTSerif-BoldItalic] [\s!features=\s!default]
\stoptypescript

第二个例子:

\definefont[SerifS][\s!file:GenBkBasR at \smallfontsize]

\s!与字体相关?我应该在我的 Typescript 文件中使用它吗?

答案1

\s!是宏的内部 ConTeXt 前缀,仅当您知道自己在做什么时才应使用。对于用户定义的打字稿,请使用类似

\starttypescript[sans][biolinum][name]
    \setups[font:fallback:Serif]
    \definefontsynonym [Sans]           [name:Linux Biolinum O]             [features=default]
    \definefontsynonym [SansBold]       [name:Linux Biolinum O Bold]        [features=default]
    \definefontsynonym [SansItalic]     [name:Linux Biolinum O Italic]      [features=default]
    \definefontsynonym [SansBoldItalic] [name:Linux Biolinum Slanted O Bold][features=default]
    \definefontsynonym [SansSlanted]    [name:Linux Biolinum O Slanted]     [features=default]
    \definefontsynonym [SansSlantedBold][name:Linux Biolinum Slanted O Bold][features=default]
\stoptypescript

答案2

根据 Esteis 的要求,我只是将我的回答来自此处的另一个问题。一旦 Esteis 修改了其他问题,我就会从那里删除答案,只保留这个。

\c!...那些讨厌的、、\v!...宏是什么\e!...以及为什么 ConTeXt 要使用它们?

ConTeXt 的一个经常被忽视的功能是它有一个多语言界面. 大多数教程和手册都是这样开头的:

\starttext
Hello world
\stoptext

context filename并要求您使用(这反过来会加载默认格式)编译文档cont-en。但是,您也可以使用法语界面

\demarretexte
Hello world
\stoppetexte

如果你编译文档context --interface=fr filename(这反过来会加载法语cont-fr格式)或添加

% interface=fr

在文件的第一行,并使用 编译文档context filename。您可以查看mult-def.lua可用的语言以及该语言的宏名称。

定义这样的多语言界面很简单:只需将\def法语\demarretexte转换为英语\starttext格式cont-fr即可;然后这样做全部宏。(这大概就是 ConTeXt 所做的,尽管现在它使用 Lua 来简化映射)。

但是 ConTeXt 也使用键值驱动的界面。在英文界面中,你可以这样写:

\startchapter[title={A long title in which we say hello to the world},
             marking={Hello world}, % short title for headers and footer
             bookmark={World}, %title for bookmarks
            ]
Hello World.
\stopchapter

因此,在法语界面中,您需要写入:

\demarrechapitre[titre={Que celui où nous dire bonjour au monde},
               marquage={Bonjour monde},
               marquepage={Monde}]
Bonjour monde
\stoppechapitre 

这样的多种语言定义一个键值驱动接口?这就是\c!...\v!...宏的用武之地。(请记住,在\unprotected 模式下!letter,因此\c!something是名为“c!something”的宏)。在核心包中,ConteXt 定义

 \definehead[\v!chapter][...]

这定义了(除其他外)一个宏\e!start\v!chapter:在英语界面中,,\e!start=start\v!chapter=chapter在法语界面中\e!start=demarre\v!chapter=chapitre。因此我们得到\startchapter\demarrechapitre

在排版章节标题时,ConTeXt 会将其用作\currentheadparameter\c!title标题。在英文界面中\c!title,它会翻译为title,ConTeXt 会查找title关键字;在法文界面中,\c!title它会翻译为titre,ConteXt 会查找titre关键字。瞧,我们有一个多语言的键值界面。

答案3

详见相应的 wiki 页面 (https://www.contextgarden.net/System_Macros/Scratch_Variables):

  • \s!:这些是保存系统常量的宏,即永远不会改变的值
  • \c!:这些是保存键值对中常量键的宏。实际定义取决于当前正在使用的多语言界面
  • \v!:这些是宏,以键值对的形式保存变量值的名称。实际定义取决于当前正在使用的多语言界面
  • \??:这些是多语言接口常量调用。
  • \@@:这些都是多语言界面不断扩展的结果。

正如本 wiki 页面的标题所示,这些是临时变量的前缀,因此以其中一个开头的宏包含各种类型的数据。

当然,正如您所要求的\??dt##1:这只是回忆系统变量的内部名称,正如您在相应的定义中所看到的\definesystemvariable

\unexpanded\def\definesystemvariable#1{\expandafter\edef\csname\??prefix#1\endcsname{\@@prefix#1}}

此答案之前已发布这里。 作为阿迪亚让我在这里重新发布,我复制了全部内容。

相关内容