LaTeX 中的拉丁现代数学

LaTeX 中的拉丁现代数学

看来 Latin Modern Math 字体只能与 XeTeX 和 LuaTeX 配合使用。是否可以将 Latin Modern Math 字体与 LaTeX 和 pdfLaTeX 配合使用?


出版商要求我使用 LaTeX/pdfLaTeX,因此使用 XeTeX 或 LuaTeX 不是一个选择。我不能使用奇怪的软件包,我必须使用最少的附加软件包。文章的字体是 Latin Modern,文件的编码设置为 uft8,我无权更改这些。

我想使用\lBrackLatin Modern Math 字体中的符号。字体根据以下定义Unicode 数学符号在拉丁现代数学中。但是,当我使用\lBrackpdfLaTeX 时,它告诉我\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)的解决方案(及解决方案草图):

  1. 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
    
  2. 然后 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
    
  3. 此描述可以转换为 PDF 页面描述运算符。但是,上面的短运算符(m,,,,...)是用户定义的运算符,它们在序言中定义。例如,扩展为和^到。对于有一个直接的 PDF 运算符,但三次贝塞尔曲线的 PDF 运算符是PostScript 中的运算符。因此,需要将的相对坐标转换为的绝对坐标。例如,注释中显示了一些重新计算:pcmmovetocrcurvetomovetomccurvetorcurvetocurveto

    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 文件中看到。

  4. 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
    
  5. 对于不同的数学样式(\scriptstyle\scriptscript样式),需要重复此过程。然后可以通过 定义符号\mathchoice。但是,\left\right不受支持。

结果:

结果

答案3

也许我更能理解你在说什么。所以我会再试一次。

您谈论的符号027E6是 unicode 字体字符。您可以通过包访问此字符unicode-math。但是您必须使用除 之外的某种 LaTeX 风格pdfLaTeX:例如,根据包,xetexluatex

否则,您将不得不进行一些黑客攻击。例如,如果您直接在文档中输入 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}

在此处输入图片描述

相关内容