有命令"---
(西里爾字母破折號)定義在通天塔包(俄文)。它比通常的英語破折號更短---
,周圍的空格也更短(而且正如我所見,它們是不間斷的)。這些空間的寬度是多少?它等於\,
空間的寬度嗎?
答案1
該命令\cyrdash
負責列印破折號;當當前語言是俄語時,它會列印字元 22(與破折號相同的插槽,但在 T2A 編碼字體中它更短)或
\hbox to 0.8em{--\hss--}
當目前編碼不是T2A時,這表示它疊加了兩個破折號,使整體寬度為0.8em(因此隨字體變化)。的定義"-
有點複雜:
\declare@shorthand{russian}{"-}{%
\def\russian@sh@tmp{%
\if\russian@sh@next-\expandafter\russian@sh@emdash
\else\expandafter\russian@sh@hyphen\fi}%
\futurelet\russian@sh@next\russian@sh@tmp}
\def\russian@sh@hyphen{\nobreak\-\bbl@allowhyphens}
\def\russian@sh@emdash#1#2{\cdash-#1#2}
\def\cdash#1#2#3{\def\tempx@{#3}%
\def\tempa@{-}\def\tempb@{~}\def\tempc@{*}%
\ifx\tempx@\tempa@\@Acdash\else
\ifx\tempx@\tempb@\@Bcdash\else
\ifx\tempx@\tempc@\@Ccdash\else
\errmessage{Wrong usage of cdash}\fi\fi\fi}
\def\@Acdash{\ifdim\lastskip>\z@\unskip\nobreak\hskip.2em\fi
\cyrdash\hskip.2em\ignorespaces}%
\def\@Bcdash{\leavevmode\ifdim\lastskip>\z@\unskip\fi
\nobreak\cyrdash\penalty\exhyphenpenalty\hskip\z@skip\ignorespaces}%
\def\@Ccdash{\leavevmode
\nobreak\cyrdash\nobreak\hskip.35em\ignorespaces}%
基本上它的意思是"-
產生\russian@sh@hyphen
,而"--
確實\russian@sh@emdash
。
前者的問題\nobreak
是前面的單字部分可以用連字符連接;然後插入一個任意連字符,允許用連字符連接後面的單字部分。
後者查看接下來的兩個標記(第一個是 still -
);根據第三個字元有四種情況
"---
問題\@Acdash
;"--~
問題\@Bcdash
;"--*
問題\@Cdash
;- 以上都不是,所以
"--
後面跟著(忽略)空格和另一個標記,而不是-
,~
或~
。
Wrong usage of cdash
在第四種情況下會出現錯誤。
如果有的話,案例
"---
會刪除前面的空格,在這種情況下,會插入一個寬度為 0.2em 的不間斷空格,然後\cyrdash
再插入一個寬度為 0.2em 的不間斷空格。此情況
"--~
會刪除前面的空格(如果存在),\cyrdash
然後插入,然後像顯式連字號一樣進行懲罰,忽略後面的空格。案例
"--*
是「對話」:前面沒有空格,\cyrdash
後面有 0.35em 的空格,忽略後面的空格。
定義中有一個錯誤:"---
放在段落的開頭可能會產生意外的結果。\leavevmode
開頭應該會有像其他兩個巨集一樣的內容。
\documentclass{article}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
%% fix the error
\makeatletter
\def\@Acdash{\leavevmode\ifdim\lastskip>\z@\unskip\nobreak\hskip.2em\fi
\cyrdash\hskip.2em\ignorespaces}%
\makeatother
\begin{document}
\verb|"-|: a"-b
\verb|"---|: a"---b a "--- b
\verb|"--~|: a"--~b a "--~ b
\verb|"--*|: "--*a "--* a
\end{document}