使文本中的连字符略长且细

使文本中的连字符略长且细

尽管我认为这是一个重复,但我找不到一个相当简单的问题的答案。我担心各种连字符或破折号的出现。在这次讨论,建议必须将 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 文档中,cmr10cmlh10NFSS 字体加载替换。

\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 映射为连字符。

在此处输入图片描述

相关内容