看来 Latin Modern Math 字体只能与 XeTeX 和 LuaTeX 配合使用。是否可以将 Latin Modern Math 字体与 LaTeX 和 pdfLaTeX 配合使用?
出版商要求我使用 LaTeX/pdfLaTeX,因此使用 XeTeX 或 LuaTeX 不是一个选择。我不能使用奇怪的软件包,我必须使用最少的附加软件包。文章的字体是 Latin Modern,文件的编码设置为 uft8,我无权更改这些。
我想使用\lBrack
Latin Modern Math 字体中的符号。字体根据以下定义Unicode 数学符号在拉丁现代数学中。但是,当我使用\lBrack
pdfLaTeX 时,它告诉我\lBrack
未定义。问题不在于命令\lBrack
本身。我不介意定义它。我只想让\lBrack
拉丁现代数学字体中的 (Unicode 027E6) 符号出现在我的输出中,即 pdfLaTeX 生成的 PDF 文件。
我不想使用提供类似符号的其他包,这不是一个选择。
如果我使用 XeLaTeX 我可以写类似这样的内容:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{unicode-math}
\pagestyle{empty}
\begin{document}
$\lBrack$
\end{document}
但正如我所写,我不能使用 XeLaTeX,而必须使用 pdfLaTeX。如果我在相同的代码上运行 pdfLaTeX,我会得到一个错误,因为unicode-math
需要 XeLaTeX 或 LuaTex 引擎。
本质上,我想要一些命令而不添加任何包来执行上述代码在 XeLaTeX 中所做的事情。
我尝试过直接访问宪章,但似乎不起作用。例如,我尝试过:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{amssymb}
\pagestyle{empty}
\begin{document}
$\mathsf{\mathbf{}}$
${\mathchar"027E8}$
\end{document}
这确实可以用 pdfLaTeX 编译,但不能正常工作:它会产生另一个字符,而不是\lBrack
。
附言:我不知道为什么我需要放在\mathsf{\mathbf{}}
那里,我也不明白为什么我需要amssymb package
,但没有这些它就无法编译。它给出一个错误
\textfont 7 is undefined (character è)
答案1
首先说明一下:使用 xelatex 时您永远不应该加载 inputenc(您在示例中这样做了)。
除此之外:理论上,可以在 pdftex 中使用开放类型字体中的符号。但您需要创建一个 tfm 文件,您需要创建 enc 文件和一个 map 条目。而且由于 pdftex 无法对开放类型进行子集化,您可能还需要拆分开放类型并创建各种 type1 字体。这意味着很多工作 - 在我看来,所有这些新文件都将算作“奇怪的包”,因此您的出版商不会喜欢它。如果您真的不想使用任何其他包,您可以像这样作弊:
\documentclass{article}
\usepackage{lmodern}
\begin{document}
$\lbrack\!\lbrack x \rbrack\!\rbrack$
\end{document}
答案2
下面是针对固定字体大小(示例中为 10pt)的解决方案(及解决方案草图):
LuaTeX 文档将一个字符打印在页面上,字符框周围的边距已知。示例使用
10bp
。使用作为单位bp
,因为它是 PostScript 和 PDF 的自然单位。这使得计算更容易。% lbrack.tex \mag=10000 % enlarge by factor 10 \documentclass{article} \usepackage{unicode-math} \setmathfont{latinmodern-math.otf} \pagestyle{empty} \begin{document} \sbox0{$\lBrack$} % print the TeX dimensions of the character glyph \typeout{* wd = \the\wd0} \typeout{* ht = \the\ht0} \typeout{* dp = \the\dp0} % the rule in the margin marks the base line \sbox0{\vrule width 10bp height .1bp depth .1bp $\lBrack$} % add margin of 10bp to the other margins \wd0=\dimexpr\wd0+10bp\relax \ht0=\dimexpr\ht0+10bp\relax \dp0=\dimexpr\dp0+10bp\relax % Output the box on a PDF page with the same dimensions. \pdfpagewidth=\wd0 \pdfpageheight=\dimexpr\ht0+\dp0\relax \pdfhorigin=0pt \pdfvorigin=0pt \shipout\copy0 \end{document}
生成PDF文件的命令:
$ lualatex lbrack
然后 ghostscript 的
pswrite
设备将字符字形的 PostScript 描述写入 PostScript 文件中。但是,大小必须足够大,否则pswrite
将使用位图内联图形。因此,我\mag=10000
在前面的步骤中使用了 TeX 文档。这会将字符放大 10 倍。生成PostScript文件的命令:
$ gs -sDEVICE=pswrite -sOutputFile=lbrack.ps -dBATCH -dNOPAUSE lbrack.pdf
页面描述
lbrack.ps
:%%Page: 1 1 %%PageBoundingBox: 0 0 241 300 %%BeginPageSetup GS_pswrite_2_0_1001 begin 241 300 null setpagesize /pagesave save store 197 dict begin 0.1 0.1 scale %%EndPageSetup gsave mark Q q 0 0 2414 0 0 2996 ^ Y 20 w K 0 1249.1 1000 0 S 0.996264 i 1386.55 1020 m 0 11 -8.98 20 -19.93 20 c -84.62 0 0 916 ^ p 10.95 0 19.93 9 19.93 20 c 0 11 -8.99 20 -19.97 20 c -249.61 0 0 -996.02 ^ p 10.98 0 19.97 9 19.97 20 c h 1242 1956 0 -916 -85.03 0 ^ H f cleartomark end end pagesave restore showpage %%PageTrailer
此描述可以转换为 PDF 页面描述运算符。但是,上面的短运算符(
m
,,,,...)是用户定义的运算符,它们在序言中定义。例如,扩展为和^
到。对于有一个直接的 PDF 运算符,但三次贝塞尔曲线的 PDF 运算符是PostScript 中的运算符。因此,需要将的相对坐标转换为的绝对坐标。例如,注释中显示了一些重新计算:p
c
m
moveto
c
rcurveto
moveto
m
c
curveto
rcurveto
curveto
0.996264 i 1386.55 1020 m % 0 11 -8.98 20 -19.93 20 c 1386.55 1031 1377.57 1040 1366.62 1040 curveto % -84.62 0 0 916 ^ pstack p % -84.62 0 rlineto 0 916 rlineto 84.62 0 rlineto 1282 1040 lineto 1282 1956 lineto 1366.62 1956 lineto % current point: 1366.62 1956 % 10.95 0 19.93 9 19.93 20 c 1377.57 1956 1386.55 1965 1386.55 1976 curveto % current point: 1386.55 1976 % 0 11 -8.99 20 -19.97 20 c 1386.55 1987 1387.56 1996 1366.58 1996 curveto % -249.61 0 0 -996.02 ^ p % -249.61 0 rlineto 0 -996.02 rlineto 249.61 0 rlineto 1116.97 1996 lineto 1116.97 999.98 lineto 1366.58 999.98 lineto currentpoint pstack pop pop % current point: 1366.58 999.98 % 10.98 0 19.97 9 19.97 20 c 1377.56 999.98 1386.55 1008.95 1386.55 1019.98 curveto h % 1242 1956 0 -916 -85.03 0 ^ H % 1242 1956 moveto 0 -916 rlineto -85.03 0 rlineto 0 916 rlineto 1242 1956 moveto 1242 1040 lineto 1156.97 1040 lineto 1156.97 1956 line f
此外,PostScript 坐标按 缩放了 10 倍
pswrite
(参见0.1 0.1 scale
页面设置部分),我们已通过 将其缩放了 10 倍\mag=10000
。因此,绝对坐标需要在左侧和底部进行 1000 的校正。PDF 页面操作的结果可以在下一步的 TeX 文件中看到。TeX 文件将 PDF 页面操作放在 中
\pdfliteral
。\hbox
控制台输出或.log
步骤 1 的文件告诉我们框的尺寸。用于操作符的基线偏移可以从PostScript 输出中cm
的 垂直坐标中看到。\vrule
然后,将框放入 PDF XForm 对象中。这样,PDF 页面操作就只存储在一个地方,并且只重复使用 XForm 对象(如果字形被多次使用,则进行优化)。
最后,
\lBrack
和\rBrack
被定义(如果它们是未知的)。由于懒惰,\rBrack
它只是 的镜像版本\lBrack
。依我之见,这应该足够接近了。% test.tex \documentclass{article} \makeatletter \newcommand*{\@lrBrack}[3]{% \setbox0=\hbox to 4.16pt{% #1% \pdfliteral{% q % save #2.01 0 0 .01 0 -2.491 cm % set current transfer matrix .996264 i % flatness tolerance 386.55 20 m % moveto 386.55 31 377.57 40 366.62 40 c % curveto 282 40 l % lineto 282 956 l % lineto 366.62 956 l % lineto 377.57 956 386.55 965 386.55 976 c % curveto 386.55 987 387.56 996 366.58 996 c % curveto 116.97 996 l % lineto 116.97 -.02 l % lineto 366.58 -.02 l % lineto 377.56 -.02 386.55 8.95 386.55 19.98 c % curveto h % closepath 242 956 m % moveto 242 40 l % lineto 156.97 040 l % lineto 156.97 956 l % lineto f % fill Q% restore }% #3% }% \ht0=7.5pt % \dp0=2.5pt % \pdfxform0 % } \@ifundefined{lBrack}{% \@lrBrack{}{}{\hfill}% \edef\lBrack{\mathopen{\pdfrefxform\the\pdflastxform}}% }{} \@ifundefined{rBrack}{% \@lrBrack{\hfill}{-}{}% \edef\rBrack{\mathclose{\pdfrefxform\the\pdflastxform}}% } \makeatother \begin{document} \[ \lBrack x \rBrack \] \end{document}
现在可以使用以下命令编译此文件
pdflatex
:$ pdflatex test
对于不同的数学样式(
\scriptstyle
、\scriptscript
样式),需要重复此过程。然后可以通过 定义符号\mathchoice
。但是,\left
和\right
不受支持。
结果:
答案3
也许我更能理解你在说什么。所以我会再试一次。
您谈论的符号027E6
是 unicode 字体字符。您可以通过包访问此字符unicode-math
。但是您必须使用除 之外的某种 LaTeX 风格pdfLaTeX
:例如,根据包,xetex
或luatex
。
否则,您将不得不进行一些黑客攻击。例如,如果您直接在文档中输入 unicode 字符,则必须进行以下某种工作:
\usepackage{stmaryrd}
\usepackage[T1]{fontenc}
\usepackage[utf8x]{inputenc}
\DeclareUnicodeCharacter{"027E6}{\llbracket}
这基本上是在告诉pdfLaTeX
你你正在使用不同的编码字符/字形在你的源文件中,和当它看到unicode字符027E6时,它应该将该字形视为\llbracket
由提供的命令stmaryrd
。
此时,我假设您正在与 MWE 按照以下方式合作:
\documentclass{article}
\usepackage{stmaryrd}
\usepackage[T1]{fontenc}
\usepackage[utf8x]{inputenc}
\DeclareUnicodeCharacter{"027E6}{\llbracket}
\pagestyle{empty}
\begin{document}
$⟦$
\end{document}
我直接输入了有问题的unicode字符。
我应该指出,这实际上与拉丁现代字体无关。这完全与文档中 unicode 字符的使用有关。LaTeX (pdfLaTeX) 需要一种方法来解释如何处理字符。
如果没有这个解决方法,您将不得不使用可以xelatex
更好地处理非 ASCII 字符的类似方法。该包unicode-math
在某种程度上可以做到这一点,但无法以 可访问的方式实现pdfLaTeX
。
例如,下面的代码在xelatex
\documentclass{article}
\usepackage{unicode-math}
\usepackage{lipsum}
\pagestyle{empty}
\begin{document}
$⟦$
\end{document}
但它可以通过编译,因为unicode-math
已经告知了xelatex
如何处理字形⟦
。
你可能想看看在 Mac 上直接通过键盘将 unicode 数学符号输入 LaTeX了解有关如何实现这一点的更多信息。
如果这仍然不是你想要的,我再怎么强调提供能够反映您所做工作的 MWE 的重要性都不为过。它有助于我们更好地了解您要做的事情;否则,这就像在黑暗中射击一样 --- 尤其是当我们无法以相同的方式理解彼此的语言时。
答案4
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amssymb}
\usepackage{fourier}
\usepackage[utf8]{inputenc}
\usepackage{newunicodechar}
\newunicodechar{⟦}{\llbracket}
\pagestyle{empty}
\begin{document}
\Huge
$⟦ \left⟦f\right]$
\end{document}