在标准 LaTeX(即 cmr 字体等)中,“---”被替换为破折号。我认为这被视为连字符。是否可以使“---”实际上生成以下宏的内容?
\def\mdash{\unskip\kern.16667em\textemdash\penalty\exhyphenpenalty\hskip.16667em\relax}
(参见评论破折号:- 与 – 与 —)。
更新:我想澄清一下我想要实现的目标。假设我有几个文档共享一个“公司样式文件”(或公司类文件)。这样可以使使用语义标记的文档看起来一致。例如,\emph
可以将 的含义改为斜体或(颤抖)下划线。如果我想让破折号(输入为---
)看起来一致\mdash
(即遵守该间距),该怎么办?除了编辑所有文件并替换---
为 之外,\mdash
还有.sty
基于 的解决方案吗?
答案1
实际上,我只想在编辑器中做一个全局替换,---
但\mdash
如果你想尝试 TeX,那么
\documentclass{article}
\begin{document}
a-b 1--2
a---b c --- d
a \raisebox{-5pt}{zzz} a
$ 1+2 -3 $
x \the\numexpr -\numexpr 1-2\relax\relax
\hyphenation{zzzz-yyyy}
\rule{--3em}{2pt}
\parbox{--3em}{\raggedright a zzzzyyyy}
section: \addtocounter{section}{-1}\thesection
\bigskip\hrule\bigskip
\makeatletter
\edef\dashone{\string-}
\edef\dashtwo{\dashone\dashone}
\edef\dashthree{\dashone\dashone\dashone}
\catcode`\-=13
\protected\def\dashactive{\futurelet\dashtmp\dashtesta}
\let-\dashactive
\def\dashtesta{%
\ifx\dashtmp-\expandafter\@firstoftwo
\else\expandafter\@secondoftwo
\fi
\dashbgobble\dashone}
\def\dashbgobble#1{\futurelet\dashtmp\dashtestb}
\def\dashtestb{%
\ifx\dashtmp-\expandafter\@firstoftwo
\else\expandafter\@secondoftwo
\fi
\mdashgobble\dashtwo}
\def\mdashgobble#1{\mdash}
\def\mdash{%
\leavevmode% you need this:-)
\unskip\kern.16667em\textemdash
\penalty\exhyphenpenalty
\hskip.16667em\relax}
\let\oldsetlength\setlength
\protected\def\setlength#1#2{%
\let-\dashone\oldsetlength{#1}{#2}\let-\dashactive}
\let\oldhyphenation\hyphenation
\protected\def\hyphenation#1{%
\let-\dashone\oldhyphenation{#1}\let-\dashactive}
\makeatother
a-b 1--2
a---b c --- d
a \raisebox{-5pt}{zzz} a
$ 1+2 -3 $
x NO!%\the\numexpr -\numexpr 1-2\relax\relax
\hyphenation{zzzz-yyyy}
\rule{--3em}{2pt}
\parbox{--3em}{\raggedright a zzzzyyyy}
section: NO!%\addtocounter{section}{-1}\thesection
\end{document}
上面使用了一个不可扩展的\futurelet
测试来提前查看-
后面的一个或两个-
,这意味着它在期望数字的原始构造中不起作用(如果删除,%
您将在处收到错误NO!
)。
另一种方法是根据宏参数定义一个可扩展的前瞻\def-#1{\ifx-#1 ...
,这将使具有原始数字的情况起作用,但会从看起来像的任何上下文中产生令人讨厌的解析错误,-}
这将停止抓取参数,并会在看起来像会抓取整个组而不仅仅是单个字符的-
上下文中丢失括号组信息。-{
-