eqn/roff 中可以使用 ε 和 ℝ 符号吗?

eqn/roff 中可以使用 ε 和 ℝ 符号吗?

表示变量属于给定实坐标空间的一组常用符号是 ε ("ELEMENT OF", Unicode U+2208) 和 ℝ ("DOUBLE-STRUCK CAPITAL R", Unicode U+211D)。

这两个符号在eqntroff和/或中可用吗groff?我在文档中找不到它们。

编辑:

我已经测试了提供的答案,我可以得到符号 ε ("ELEMENT OF", Unicode U+2208),但不能得到符号 ℝ ("DOUBLE-STRUCK CAPITAL R", Unicode U+211D)。

具体来说,如果我这样做:

.TL 
Test

.NH
Introduction

.LP
Given an input in subspace \[u211D]:
.EQ
x \[mo] \[u211D] sup 2
.EN
with output estimated value:
.EQ
y hat
.EN

我收到以下错误:

cat test.ms | eqn | groff -ms > test.ps
troff: <standard input>:8: warning: can't find special character 'u211D'

从 PS 输出中可以看出,显示了 ε,但没有显示 ℝ:

格罗夫输出

我正在使用FreeBSD 12 eqngroff

答案1

如果您想在 groff 中看到像 U+211D 这样的 unicode 字符,您需要找到包含它的字体,并向 groff 提供它的字体规格文件,通常是将 ttf 文件转换为 pfa 并将其添加到列表中。

可以为您查找一些常见字体的网站是文件格式信息这表明大多数DejaVu字体都包含该字符,例如DejaVu Serif。在 Fedora 上,这个 ttf 字体可以从包中安装dejavu-sans-fonts,所以我推测 FreeBSD 可能有类似的东西。 (如果没有,请尝试其他匹配的字体之一)。

或者,如果您有以下fc-match命令,您可以找到已有的带有该字符的字体文件:

fc-match -s -f '%{file}\n' ':charset=211D'

您需要.ttf从此列表中挑选出 TrueType 文件(通常后缀)。

或者,如果您有fc-listttx命令,您可以使用以下命令在 ttf 字体中缓慢搜索字符名称:

fc-list | 
sed -n 's/\.ttf: .*/.ttf/p' |
xargs -l -t ttx -t cmap -o - 2>&1 |
grep  'ttx\|DOUBLE-STRUCK CAPITAL R'

如果找到该字形,它将输出文件名和匹配项,例如:

ttx -t cmap -o - /usr/share/fonts/dejavu/DejaVuSansMono.ttf 
      <map code="0x211d" name="uni211D"/><!-- DOUBLE-STRUCK CAPITAL R -->

然后您可以阅读 Peter Schaffter 的解释关于向 groff 添加字体。虽然这是为mom宏编写的,但它通常适用于 groff,尽管您的宏可能无法处理家庭自动地。他方便地提供了外壳脚本为您做工作。由于每个发行版都喜欢将文件放在不同的位置,因此可能需要进行一些调整。

然后,您可以将以下内容添加到您的 中eqnrc,例如:

define @R '"\f[DejaVuR]\[u211D]\fR"'

以下不需要任何新字体:

define in '{type "relation" size +3 \[mo]}'

答案2

命名字形集记录在groff_char手册页。我看到\[mo]了 ε,但没有看到 ℝ。

您可以输入任意字符,其中是十六进制数字,因此对于ℝ。也可以使用UTF-8输入,即直接插入ℝ。您可以使用以下命令为其定义一个名称[uNNNN]NNNN\[u211D].char要求:

.char \[Real] \[u211D]

我的回答仅涉及您如何输入字符。我不知道 Groff 使用的字体是否涵盖这些字符,或者如果不涵盖这些字符,如何教它使用替代字体。

答案3

为了完整起见,以下是如何在基本 troff/groff 以及eqn.

您可以使用\htroff 命令向后执行局部水平移动0.83m,这是宽度的一部分。一个是排版常规单位,约为m字体中字符的宽度。所以我们可以用另一个 R 来重击一个 R:

The R\h'-.83m'R space 1.

为了使其更具可读性,您可以定义一个使用此序列.ds调用的字符串 ()myreal并使用以下命令实例化它\*[myreal]

.ds myreal R\h'-.83m'R
The \*[myreal] space 2.

在 中,您可以通过向左移动 50/100eqn进行水平移动back 50,所以我们需要R back 50 R,但是你还想使用罗马字体,所以最好定义一个宏myreal

.EQ
define myreal 'roman { R back 50 R }'
delim $$
.EN

然后使用它。通过定义内联分隔符$and $(开始和结束),您可以在文本以及方程中调用宏:

Given an input in subspace $myreal$:
.EQ
x \[mo] myreal sup 2
.EN

在此输入图像描述


但毕竟,我发现eqn提供了fat带有偏移量的重打命令。根据字体大小,您可能需要使用参数fat_offset(单位为 ems/100)。对于上面的示例,您还可以使用

.EQ
set fat_offset 15
x \[mo] fat roman R sup 2
.EN

相关内容