尽管我认为这是一个重复,但我找不到一个相当简单的问题的答案。我担心各种连字符或破折号的出现。在这次讨论,建议必须将 Robertson-Walker 度量输入为Robertson--Walker
,即使用短划线,而半单群则带有连字符,即semi-simple
。但让我担心的是,除了连字符是非常短,并且比短破折号更粗。
我希望连字符的排版像短破折号一样,只是稍微短一点,即如该列表中间但不是底部的示例(顶部条目只是短破折号):
这是可供玩的 MWE。
\documentclass{article}
\pagestyle{empty}
\begin{document}
Robertson--Walker metric\dots looks fine but IMHO semi-simple Lie group doen't look
too good. Is there any way to make \verb|semi-simple| being typeset as
semi\raisebox{2pt}{\rule{4pt}{0.2pt}}simple?
Comparison: \begin{tabular}{l}
A--B \\ A\raisebox{2pt}{\rule{4pt}{0.2pt}}B \\ A-B
\end{tabular}
\end{document}
问题:有没有(简单或半简单的)方法可以实现这一点?
笔记: 我不感兴趣会弄乱方程式中的减号或造成其他危害的提案,我还想避免必须键入一些 LaTeX 命令而不是连字符。在理想情况下,只有 - 的外观会发生变化。
答案1
您可以使用pre_linebreak_filter
遍历 hlist,搜索 disc 节点,并使用规则替换它们的 pre、post 和 replace 字段(如果它们包含连字符)。这会使连字符在数学模式和非自由裁量上下文中保持不变。
确实,截至目前 arXiv 还不接受 LuaTeX,但还是有办法解决这个问题的:https://www.monperrus.net/martin/how-to-use-lualatex-arxiv
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
local pt = 2^16
local r = node.new("rule")
r.width = 4*pt
r.height = 2.2*pt
r.depth = -2*pt
local function is_hyphen(head)
return head and head.id == node.id("glyph") and head.char == 45
end
local function longhyphen(head)
for n in node.traverse(head) do
if n.id == node.id("disc") then
for _,v in pairs({"pre","post","replace"}) do
if is_hyphen(n[v]) then
n[v] = node.copy(r)
end
end
end
end
return head
end
luatexbase.add_to_callback("pre_linebreak_filter",
longhyphen,
"longhyphen")
\end{luacode*}
\begin{document}
Robertson--Walker
semi-simple
$a - b$
no disc-
-disc
\end{document}
答案2
除了强大且可取的 LuaTeX 解决方案之外,另一种选择是弄乱 catcodes。
连字符现在是一个活动字符。在数学模式下,它只是扩展为减号,但在文本模式下,它会吞下接下来的两个标记,检查它们是否是连字符,然后插入规则以替换单个连字符,或者扩展为适当数量的原始连字符以形成破折号连字符。
例如,这会导致严重失败
-\begin{environement}
也许可以让它具备大括号组感知能力,但是,我为什么要这么做呢?
不能退款!
\documentclass{article}
\chardef\textminus=`\-
\mathchardef\mathminus=\mathcode`\-
\begingroup
\makeatletter
\catcode`-=13
\protected\long\gdef\longhyphen#1#2{%
\ifx#1-\relax
\textminus\textminus
\ifx#2-\relax
\textminus
\else
#2%
\fi
\else
\raisebox{2pt}{\rule{4pt}{0.2pt}}#1#2%
\fi
}
\protected\gdef-{%
\ifmmode
\expandafter\mathminus
\else
\expandafter\longhyphen
\fi
}
\endgroup
\begin{document}
Robertson---Walker
Robertson--Walker
semi-simple
$a - b$
\catcode`-=13
Robertson---Walker
Robertson--Walker
semi-simple
$a - b$
\end{document}
答案3
另一种可能性尚未探索,即使用虚拟字体。为此,我们遵循如何创建虚拟字体?教程来创建我们的实例。
首先将基础字体(我使用cmr10
)复制到当前目录并将其转换为属性列表。
cp `kpsewhich cmr10.tfm` .
tftopl cmr10.tfm > cmlh10.vpl
cmlh10
我选择了代表“长连字符”的文件名lh
。打开文件cmlh10.vpl
并在最顶部添加以下行。
(MAPFONT D 0 (FONTNAME cmr10))
然后找到以 开头的行(CHARACTER O 55
,并将字符条目替换为以下内容
(CHARACTER O 55
(CHARWD R 0.500002)
(CHARHT R 0.430555)
(CHARIC R 0.027779)
(MAP
(SELECTFONT D 0)
(SETCHAR O 173)
)
)
插槽 55 和 173 都是八进制的。插槽 55 容纳连字符,插槽 173 容纳尾字符,即,我们将连字符映射到尾字符。另一个选择将会绘制一条自定义规则,而不是仅仅将 endash 映射到连字符。
(CHARACTER O 55
(CHARWD R 0.4)
(CHARHT R 0.28)
(MAP
(MOVEUP R 0.255)
(SETRULE R 0.025 R 0.4)
)
)
使用以下方法组装虚拟字体
vptovf cmlh10.vpl
在您的 TeX 文档中,cmr10
用cmlh10
NFSS 字体加载替换。
\DeclareFontShape{OT1}{cmr}{m}{n}{
<-6> cmr5
<6-7> cmr6
<7-8> cmr7
<8-9> cmr8
<9-10> cmr9
<10-12> cmlh10
<12-17> cmr12
<17-> cmr17
}{}
\documentclass{article}
\pagestyle{empty}
\begin{document}
Robertson--Walker
semi-simple
$a - b$
no disc-
-disc
\end{document}
在屏幕截图中,我将 endash 映射为连字符。