在 ConTeXt 中重新定义特定语言的符号

在 ConTeXt 中重新定义特定语言的符号

我有点跟进问题。我认为最好使用常规的长划线 (---),其大小和间距规则会根据当前语言进行调整。因此,当\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

相关内容