Я хочу использовать MnSymbol (чтобы получить различные виды стрелок вниз), но мне не нравится его символ \approx. Я бы хотел использовать базовый вариант. Я пробовал использовать savesym (как показано ниже), но он все равно выводит версию mnsymbol. Есть предложения?
\documentclass{article}
\usepackage[english]{babel}
\usepackage{savesym}
\savesymbol{approx}
\usepackage{MnSymbol}
\restoresymbol{approx}{amssymb}
\begin{document}
$\approx$
\end{document}
Редактировать -- Дополнительный вопрос
@Steven B. Segletes's answer отлично подходит для проблемы, которую я задал. Но я обнаружил, что есть куча других символов, которые я хотел бы запретить MnSymbol менять. Поэтому мне интересно, может ли быть решение с другой стороны: можем ли мы запретить MnSymbol вводить какие-либо новые определения, кроме тех конкретных символов, которые мы хотим добавить? (Те, которые мне особенно нужны, это \ndownarrow, \ndasheddownarrow и \dasheddownarrow.)
...Теперь я вижу, что @Steven B. Segletes уже ответил на этот вопрос (Стандартный оператор AMS-Sum с использованием MnSymbols?). Но как я уже сказал в комментарии ниже, я полный профан и мне страшно смотреть на все эти изменения шрифтов. Так что если у кого-то есть решение иного рода, это было бы полезно.
решение1
ПЕРЕСМОТР(по предложению ГУМ)
GuM, который явно знает больше об использовании шрифтов LaTeX, чем я, значительно улучшает мой ответ, привязываясь к кодировке, cmsy
уже известной LaTeX ( OMS
), и таким образом избегает необходимости объявлять новое семейство шрифтов и форму. GuM далее призывает правильное заклинание, чтобы также обеспечить смелую поддержку.
\documentclass{article}
%\usepackage[english]{babel}
\usepackage{MnSymbol,bm}
\DeclareSymbolFont{Xsymbols}{OMS}{cmsy}{m}{n}
\SetSymbolFont{Xsymbols}{bold}{OMS}{cmsy}{b}{n}
\DeclareMathSymbol{\Xapprox}{\mathrel}{Xsymbols}{25}
\begin{document}
$a\Xapprox b \bm{\Xapprox} c$
$a \approx b \bm{\approx} c$
\end{document}
ОРИГИНАЛЬНЫЙ ОТВЕТ
Здесь я объявляю шрифт CM symbol ( cmsy
, см. The TeXbook, стр. 431) как новое семейство шрифтов с \DeclareFontFamily
. Затем с помощью \DeclareFontShape
я сообщаю, какие размеры глифов использовать, исходя из желаемого размера точки (например, все, что больше 12 точек, является масштабированной версией глифов cmsy12
). Затем я объявляю новый шрифт symbol Xcmsy
, который использует cmsy
семейство шрифтов. Наконец, я использую \DeclareMathSymbol
для извлечения правильного глифа из Xcmsy
шрифта symbol и вызываю его \Xapprox
. Я убеждаюсь, что он используется как \mathrel
тип, и он использует слот 25
( '031
восьмеричный, "19
шестнадцатеричный) этого шрифта Symbol, который соответствует символу \approx
.
\documentclass{article}
%\usepackage[english]{babel}
\usepackage{MnSymbol}
\DeclareFontFamily{U} {cmsy}{}
\DeclareFontShape{U}{cmsy}{m}{n}{
<-6> cmsy5
<6-7> cmsy6
<7-8> cmsy7
<8-9> cmsy8
<9-10> cmsy9
<10-12> cmsy10
<12-> cmsy12}{}
\DeclareSymbolFont{Xcmsy} {U} {cmsy}{m}{n}
\DeclareMathSymbol{\Xapprox}{\mathrel}{Xcmsy}{25}
\begin{document}
$a\Xapprox b$
$a \approx b$
\end{document}
решение2
\approx
Сохранение невозможно savesym
.Нет символаопределяется с помощью \DeclareMathSymbol
can.
Пакет savesym
можеттолькоработать с командами, определенными с помощью \newcommand
(при условии, что команда не имеет необязательного аргумента); это не будет работать, если команда определена с помощью \DeclareRobustCommand
по причинам, описанным в документации letltxmacro
(см. такжеhttps://tex.stackexchange.com/a/47372/4427).
Давайте посмотрим, что получится. Если вы используете правильный синтаксис, то есть
\usepackage{savesym}
\show\approx
\savesymbol{approx}
\usepackage{MnSymbol}
\restoresymbol{mn}{approx}
\show\approx
\show\mnapprox
( \show
строки предназначены только для отладки) вы получите на терминале:
> \approx=\mathchar"3219.
> \approx=\mathchar"3219.
> \mnapprox=\mathchar"3704.
Вместо mn
вы можете использовать любую строку, которая вам больше нравится (для команд, работающих с savesym
, конечно, не эту).
Это означает, что \approx
это символ отношения ( 3
), из шрифта в математической группе 2
, слот "19
.
Однако при запуске документа MnSymbol
назначается \U/MnSymbolF/m/n/10
шрифт в математической группе 2
, которая соответствует MnSymbolF10
. Соответствующая часть таблицы шрифтов показана здесь:
и действительно, ваш документ будет распечатан
что не очень похоже на approx
символ. Действительно, в MnSymbol.sty
мы находим
\DeclareSymbolFont{symbols}{U}{MnSymbolF}{m}{n}
который переопределяет стандартное объявление для symbols
шрифта, соответствующее математической группе 2. Назначения operators
математической группе 0, letters
математической группе 1, symbols
математической группе 2 и largesymbols
математической группе 3 являются обязательными. Позже, 25-я строка (25 десятичная — 19
шестнадцатеричная) после строки 1446 (где счетчик повторно инициализируется нулем для определения символов из symbols
шрифта) имеет
\Decl@Mn@Char\dbigdoublecurlywedge{symbols}{\mathop}
что подтверждает «неожиданный» символ, который вы видите вместо \approx
. Надо сказать, что MnSymbol
использует очень непонятный код. Действительно, как показывает значение \mnapprox
, символ «approximates» в MnSymbol
взят из шрифта в математической группе 7, слот "04
.
Единственный выход — это стратегия \DeclareSymbolFont
, описанная в прекрасном ответе Стивена.
решение3
Редактировать:
Я прочитал команды сохранения символа и восстановления символа.
Когда вы сохраняете «approx», то создается «origapprox».
При восстановлении «approx» командой:
\restore{last}{approx}
затем «approx» снова должен стать таким же, как «origapprox», который был сохранен, а «lastapprox» станет последним значением approx перед восстановлением.
Итак, если у нас есть следующий код:
\documentclass{article}
\usepackage[english]{babel}
\usepackage{savesym}
\savesymbol{approx}
\usepackage{MnSymbol}
\restoresymbol{UnwantedChanged}{approx}
\begin{document}
$\approx$
$\origapprox$
$\UnwantedChangedapprox$
\end{document}
мы ожидаем approx с символом MnSymbol origapprox с символом до загрузки MnSymbol и UnwantedChangedapprox с загруженным MnSymbol
но приведенный выше код дает настоящий символ приближения только в последней строке.
Удалив последнюю строку печати и команду восстановления, я увидел, что команда savesymbol уже восстановила символ и печатает как approx старый approx и как origapprox последний...
Это значит, что для решения вашей проблемы вам нужно просто удалить команду восстановления... Я не знаю, почему... может быть, код в savesym был изменен и восстанавливается автоматически после загрузки нового символа, или, может быть, MnSymbol делает этот трюк.
Старый ответ: (чтобы понять первый -справедливый- комментарий @StevenB.Segletes)
Вы написали команду с противоположными аргументами. Попробуйте:
\restoresymbol{approx}{amssymb}