表示变量属于给定实坐标空间的一组常用符号是 ε ("ELEMENT OF", Unicode U+2208) 和 ℝ ("DOUBLE-STRUCK CAPITAL R", Unicode U+211D)。
这两个符号在eqn
、troff
和/或中可用吗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
eqn
和groff
。
答案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-list
和ttx
命令,您可以使用以下命令在 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
.
您可以使用\h
troff 命令向后执行局部水平移动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