第一个例子:
\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!...
宏的用武之地。(请记住,在\unprotect
ed 模式下!
是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}}