Проблема с использованием шрифта из newtxmath

Проблема с использованием шрифта из newtxmath

Я пытаюсь настроить предпочитаемую мной смесь шрифтов из mathptmxи newtxmath. Для этого потребуется использовать largsymbolsшрифт из newtxmath, так как его интегралы мне нравятся больше, чем из mathptmx. Однако этот шрифт просто не загружается. Вот простой фрагмент, иллюстрирующий проблему:

\documentclass[a4paper]{report}
\DeclareSymbolFont{largesymbols}{OMX}{ntxex}{m}{n}

\begin{document}
$\forall\exists<>\leq\geq\int\subseteq\supseteq$
\[\int abcdefghijklmnopqrstuvwxyz+-=\alpha\]
\end{document}

Результат с pdfTeX:

This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./newtxtest2.tex
LaTeX2e <2014/05/01>
Babel <3.9k> and hyphenation patterns for 78 languages loaded.
(/usr/local/texlive/2014/texmf-dist/tex/latex/base/report.cls
Document Class: report 2007/10/19 v1.4h Standard LaTeX document class
(/usr/local/texlive/2014/texmf-dist/tex/latex/base/size10.clo))
(./newtxtest2.aux)

LaTeX Font Warning: Font shape `OMX/ntxex/m/n' undefined
(Font)              using `OMX/cmex/m/n' instead on input line 5.

[1{/usr/local/texlive/2014/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
(./newtxtest2.aux)

LaTeX Font Warning: Some font shapes were not available, defaults substituted.

 )</usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb
></usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb>
</usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></
usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb>
Output written on newtxtest2.pdf (1 page, 37359 bytes).
SyncTeX written on newtxtest2.synctex.gz.
Transcript written on newtxtest2.log.

введите описание изображения здесь

То же самое касается XeLaTeX. Теперь, в более сложной ситуации с моим пакетом, я получил ошибку. В этом случае я получаю предупреждение и неправильную форму для интеграла: я получаю Computer Modern, по умолчанию, если я правильно понял cmex. Действительно, добавление

\SetSymbolFont{largesymbols}{bold}{OMX}{ntxex}{b}{n}
  \DeclareFontSubstitution{OMX}{ntxex}{m}{n}

производит, с XeLaTeX:

This is XeTeX, Version 3.14159265-2.6-0.99991 (TeX Live 2014) (preloaded format=xelatex)
 restricted \write18 enabled.
entering extended mode
(./newtxtest2.tex
LaTeX2e <2014/05/01>
Babel <3.9k> and hyphenation patterns for 78 languages loaded.
(/usr/local/texlive/2014/texmf-dist/tex/latex/base/report.cls
Document Class: report 2007/10/19 v1.4h Standard LaTeX document class
(/usr/local/texlive/2014/texmf-dist/tex/latex/base/size10.clo))
(./newtxtest2.aux)
No file OMXntxex.fd.

./newtxtest2.tex:6: LaTeX Error: This NFSS system isn't set up properly.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.6 \begin{document}

Но код буквально скопирован из пакета, так что же здесь происходит? Почему он .fdне найден? Я знаю, где он находится, но, TeXпохоже, нет, и если я помещаю его туда, где TeXего можно найти, он начинает делать странные вещи и вызывать metafontи в итоге не имеет .tfm:

[…]
kpathsea: Running mktextfm bickham-r
mktextfm: Running mf-nowin -progname=mf \mode:=ljfour; mag:=1; nonstopmode; input bickham-r
This is METAFONT, Version 2.7182818 (TeX Live 2014) (preloaded base=mf)

kpathsea: Running mktexmf bickham-r

! I can't find file `bickham-r'.
<*> ...jfour; mag:=1; nonstopmode; input bickham-r

Please type another input file name
! Emergency stop.

Почему это происходит? Как мне получить нужную форму для интегрального символа без newtxmathпрямой загрузки?

решение1

Если вам не нужно масштабирование, то как минимум вам понадобится что-то вроде этого:

\documentclass[a4paper]{report}
  \DeclareFontEncoding{LMX}{}{}
  \DeclareFontSubstitution{LMX}{ntxexx}{m}{n}
  \DeclareFontFamily{LMX}{ntxexx}{}
  \DeclareFontShape{LMX}{ntxexx}{m}{n}{<->ntxexx}{}
  \DeclareFontShape{LMX}{ntxexx}{b}{n}{<->ntxbexx}{}
  \DeclareFontShape{LMX}{ntxexx}{bx}{n}{<->ssub ntxexx/b/n}{}
  \DeclareSymbolFont{largesymbols}{LMX}{ntxexx}{m}{n}
  \SetSymbolFont{largesymbols}{bold}{LMX}{ntxexx}{b}{n}
\begin{document}
  $\forall\exists<>\leq\geq\int\subseteq\supseteq$
  \[\int abcdefghijklmnopqrstuvwxyz+-=\alpha\]
\end{document}

неразбериха

Однако, если вы хотите использовать только несколько символов из шрифта, это не лучший способ сделать это (потому что все, что использует , largesymbolsтеперь будет использовать newtxmathшрифты), и это в любом случае не будет работать правильно (потому что LMXне эквивалентно OMX).

Поэтому лучше создать новый символьный шрифт и использовать его только для переопределения нужных вам символов (какответ egreg делает).

Однако вы также можете захотеть использовать интегральные символы для математического расширения A из newtxmath. В этом случае вам нужно настроить дополнительный шрифт, но эту конфигурацию можно взять напрямую, newtxmath.styпоскольку она уже определяет дополнительный шрифт символов.

Собираем это вместе:

\documentclass[a4paper]{report}
\usepackage{mathtools}
\makeatletter
\DeclareFontEncoding{LMX}{}{}
\DeclareFontSubstitution{LMX}{ntxexx}{m}{n}
\DeclareFontFamily{LMX}{ntxexx}{}
\DeclareFontShape{LMX}{ntxexx}{m}{n}{<->ntxexx}{}
\DeclareFontShape{LMX}{ntxexx}{b}{n}{<->ntxbexx}{}
\DeclareFontShape{LMX}{ntxexx}{bx}{n}{<->ssub ntxexx/b/n}{}
\DeclareSymbolFont{largesymbolsTX}{LMX}{ntxexx}{m}{n}
\SetSymbolFont{largesymbolsTX}{bold}{LMX}{ntxexx}{b}{n}
\DeclareMathSymbol{\intop}{\mathop}{largesymbolsTX}{"52}
    \def\int{\intop\nolimits}
\DeclareMathSymbol{\ointop}{\mathop}{largesymbolsTX}{"48}
    \def\oint{\ointop\nolimits}
\DeclareSymbolFont{largesymbolsTXA}{U}{ntxexa}{m}{n}
\SetSymbolFont{largesymbolsTXA}{bold}{U}{ntxexa}{b}{n}
\DeclareFontSubstitution{U}{ntxexa}{m}{n}
\def\re@DeclareMathSymbol#1#2#3#4{%
  \let#1=\undefined
  \DeclareMathSymbol{#1}{#2}{#3}{#4}}
\re@DeclareMathSymbol{\oiintop}{\mathop}{largesymbolsTXA}{8}
\def\oiint{\oiintop\ilimits@}
\re@DeclareMathSymbol{\ointctrclockwiseop}{\mathop}{largesymbolsTXA}{10}
\def\ointctrclockwise{\ointctrclockwiseop\ilimits@}
\re@DeclareMathSymbol{\ointclockwiseop}{\mathop}{largesymbolsTXA}{12}
\def\ointclockwise{\ointclockwiseop\ilimits@}
\re@DeclareMathSymbol{\sqintop}{\mathop}{largesymbolsTXA}{14}
\def\sqint{\sqintop\ilimits@}
\re@DeclareMathSymbol{\iintop}{\mathop}{largesymbolsTXA}{33}
\def\iint{\iintop\ilimits@}
\re@DeclareMathSymbol{\iiintop}{\mathop}{largesymbolsTXA}{35}
\def\iiint{\iiintop\ilimits@}
\re@DeclareMathSymbol{\iiiintop}{\mathop}{largesymbolsTXA}{37}
\def\iiiint{\iiiintop\ilimits@}
\re@DeclareMathSymbol{\idotsintop}{\mathop}{largesymbolsTXA}{39}
\def\idotsint{\idotsintop\ilimits@}
\re@DeclareMathSymbol{\oiiintop}{\mathop}{largesymbolsTXA}{41}
\def\oiiint{\oiiintop\ilimits@}
\re@DeclareMathSymbol{\varointctrclockwiseop}{\mathop}{largesymbolsTXA}{43}
\def\varointctrclockwise{\varointctrclockwiseop\ilimits@}
\re@DeclareMathSymbol{\varointclockwiseop}{\mathop}{largesymbolsTXA}{45}
\def\varointclockwise{\varointclockwiseop\ilimits@}
\re@DeclareMathSymbol{\fintop}{\mathop}{largesymbolsTXA}{62}
\def\fint{\fintop\ilimits@}
\re@DeclareMathSymbol{\oiintctrclockwiseop}{\mathop}{largesymbolsTXA}{64}
\def\oiintctrclockwise{\oiintctrclockwiseop\ilimits@}
\re@DeclareMathSymbol{\varoiintclockwiseop}{\mathop}{largesymbolsTXA}{66}
\def\varoiintclockwise{\varoiintclockwiseop\ilimits@}
\re@DeclareMathSymbol{\oiiintctrclockwiseop}{\mathop}{largesymbolsTXA}{68}
\def\oiiintctrclockwise{\oiiintctrclockwiseop\ilimits@}
\re@DeclareMathSymbol{\varoiiintclockwiseop}{\mathop}{largesymbolsTXA}{70}
\def\varoiiintclockwise{\varoiiintclockwiseop\ilimits@}
\re@DeclareMathSymbol{\oiintclockwiseop}{\mathop}{largesymbolsTXA}{72}
\def\oiintclockwise{\oiintclockwiseop\ilimits@}
\re@DeclareMathSymbol{\varoiintctrclockwiseop}{\mathop}{largesymbolsTXA}{74}
\def\varoiintctrclockwise{\varoiintctrclockwiseop\ilimits@}
\re@DeclareMathSymbol{\oiiintclockwiseop}{\mathop}{largesymbolsTXA}{76}
\def\oiiintclockwise{\oiiintclockwiseop\ilimits@}
\re@DeclareMathSymbol{\varoiiintctrclockwiseop}{\mathop}{largesymbolsTXA}{78}
\def\varoiiintctrclockwise{\varoiiintctrclockwiseop\ilimits@}
\re@DeclareMathSymbol{\sqiintop}{\mathop}{largesymbolsTXA}{80}
\def\sqiint{\sqiintop\ilimits@}
\re@DeclareMathSymbol{\sqiiintop}{\mathop}{largesymbolsTXA}{82}
\def\sqiiint{\sqiiintop\ilimits@}
\makeatother
\begin{document}
  $\forall\exists<>\leq\geq\int\subseteq\supseteq$
  \[\int abcdefghijklmnopqrstuvwxyz+-=\alpha\]
  \[\int \oint \iint \iiint \iiiint \idotsint \idotsint \]
\end{document}

различные интегралы

решение2

Я не знаю, почему вы хотите использовать mathptmxи заменять символы из newtxmathвместо того, чтобы напрямую использовать последний. Шрифты, предоставляемые из, mathptmxв значительной степени уродливы, потому что они созданы из разных источников; в частности, греческие буквы отвратительны.

Однако вот как это можно сделать для интеграла. Я оставлю вам другие символы. Обратите внимание, что newtxдля своего шрифта расширения математики используется другая кодировка шрифта, поскольку она вмещает гораздо больше символов, чем стандартная кодировка OMX. Кроме того, определение математической largesymbolsгруппы, безусловно, не рекомендуется, поскольку это должно сопровождаться переопределением нескольких символов (или, по крайней мере, требует тщательной проверки различий между кодировками OMX и LMX).

\documentclass{article}
\usepackage{mathptmx}

\DeclareFontEncoding{LMX}{}{}
\DeclareFontSubstitution{LMX}{ntxexx}{m}{n}
\DeclareFontFamily{LMX}{ntxexx}{}
\DeclareFontShape{LMX}{ntxexx}{m}{n}{<-> ntxexx}{}
\DeclareFontShape{LMX}{ntxexx}{b}{n}{<-> ntxbexx}{}
\DeclareFontShape{LMX}{ntxexx}{bx}{n}{<->ssub ntxexx/b/n}{}
\DeclareSymbolFont{largesymbolsNT}{LMX}{ntxexx}{m}{n}

\DeclareMathSymbol{\intop}{\mathop}{largesymbolsNT}{"52}

\begin{document}

\[
\int_a^b f(x)\,dx
\]

\end{document}

введите описание изображения здесь

Связанный контент