我有点跟进这问题。我认为最好使用常规的长划线 (---),其大小和间距规则会根据当前语言进行调整。因此,当\language[ru]
设置时,它应该给出\unskip\thinspace\cyrdash\hskip.166em\ignorespaces
,其中\cyrdash
定义为\scale[sx=0.85]{–}
,例如。
在 ConTeXt 中实现这一点的最正确的方法是什么?
UPD1:我基本上正在寻找一些测试命令来查找当前使用的语言。
答案1
您可以使用字体组合切换字符间距来更改破折号的外观。第一步,您需要创建一个带有压缩破折号的单独字体。
\definefontfeature[russian][extend=0.8]
\definefallbackfamily [russianfont] [rm] [DejaVu Serif] [range={0x2013,0x2014},force=yes,features=russian]
\definefontfamily [russianfont] [rm] [DejaVu Serif]
\definefontfamily [latinfont] [rm] [DejaVu Serif]
\setupbodyfont[latinfont]
\starttext
em—dash
\blank \switchtobodyfont[russianfont]
em—dash
\stoptext
下一步是在破折号前后添加空格。
\definecharacterspacing [russianpunctuation]
\setupcharacterspacing [russianpunctuation] ["2014] [left=.16667,right=.16667,alternative=1]
\starttext
em—dash
\blank \setcharacterspacing[russianpunctuation]
em—dash
em — dash
\stoptext
---
为了确保在文档中使用该模块时,破折号取自后备字体translate
。
\usemodule[translate]
\translateinput[---][—]
\enableinputtranslation
\starttext
em---dash
\stoptext
最后一步是仅在更改语言时启用这些设置,这可以通过将命令放入设置环境中并使用启用它来完成\setuplanguage
。
\usemodule[translate]
\translateinput[---][—]
\definefontfeature[russian][extend=0.8]
\definefallbackfamily [russianfont] [rm] [DejaVu Serif] [range={0x2013,0x2014},force=yes,features=russian]
\definefontfamily [russianfont] [rm] [DejaVu Serif]
\definefontfamily [latinfont] [rm] [DejaVu Serif]
\setupbodyfont[latinfont]
\definecharacterspacing [russianpunctuation]
\setupcharacterspacing [russianpunctuation] ["2014] [left=.16667,right=.16667,alternative=1]
\startsetups[russian]
\enableinputtranslation
\switchtobodyfont[russianfont]
\setcharacterspacing[russianpunctuation]
\stopsetups
\setuplanguage[ru][setups=russian]
\starttext
em—dash
\blank \language[ru]
em—dash
\stoptext
答案2
一个选项是使用特定于语言的 hspace:
\define\cyrdash{\dontleavehmode\scale[sx=0.80]{---}}
\setuplanguage
[ru]
[midsentence=\cyrdash,
leftsentence=\cyrdash,
rightsentence=\cyrdash]
\definehspace [emdash] [\zeropoint]
\definehspace [ru] [emdash] [2cm] % Exaggerated, for visualization.
\definetextmodediscretionary <
{\beginofsubsentence\prewordbreak\kern\hspaceamount\currentlanguage{emdash}}
\mainlanguage[ru]
\setupbodyfont[dejavu]
\starttext
Normal text|<|Russian
\stoptext
答案3
这也消除了在不同情况下输入不同破折号的负担。您只需输入---
或—
(unicode 破折号),它就会根据位置进行调整。
\usemodule[translate]
\translateinput[---][—]
\define\cyrdashsymbol{\dontleavehmode\scale[sx=0.80]{---}} % cyrillic dash sign
\unexpanded\def\cyrdash{\ifincsname\string—\else
\ifvmode\leavevmode\cyrdashsymbol\hskip.35em
\else\unskip\thinspace\cyrdashsymbol\hskip.166667em
\fi\fi\ignorespaces}
\catcode`\—=\active
\unexpanded\def—{\doifelse{\currentlanguage}{ru}{\cyrdash}{---}}
\mainlanguage[russian]
\setupbodyfont[dejavu]
\starttext\enableinputtranslation
--- Прямая речь --- \quotation{после \quote{тире} неразрывный пробел}.
— Прямая речь — \quotation{после \quote{тире} неразрывный пробел}.
\stoptext
由于活动字符不是 ConTeXt 中的理想解决方案,因此这里还有另一种避免使用活动字符的解决方案(顺便说一句,这不一定正确)。
\usemodule[translate]
\translateinput[---][\doifelse{\currentlanguage}{ru}{\cyrdash}{---}]
\translateinput[—][\doifelse{\currentlanguage}{ru}{\cyrdash}{---}]
\unexpanded\def\cyrdashsymbol{\dontleavehmode\scale[sx=0.80]{---}}
\unexpanded\def\cyrdash{\ifincsname\detokenize{—}\else
\ifvmode\leavevmode\cyrdashsymbol\hskip.35em
\else\unskip\thinspace\cyrdashsymbol\hskip.166667em
\fi\fi\ignorespaces}
\mainlanguage[russian]
\setupbodyfont[dejavu]
\starttext\enableinputtranslation
--- Прямая речь --- \quotation{после \quote{тире} неразрывный пробел}.
— Прямая речь — \quotation{после \quote{тире} неразрывный пробел}.
\stoptext