\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{bm}
\DeclareMathSymbol{'}{\mathord}{symbols}{"30}%
\mathchardef\normalcomma=\mathcode`,
\begingroup
\catcode`,=\active
\lccode`~=`, %
\lowercase{\endgroup
\def~}{\normalcomma\hskip0.640em}
\mathcode`\,="8000
\begin{document}
$,\bm{,}$
\end{document}
こちらのサンプルですが、\bmのコマンドを使用した時点でエラーが発生します。
エラーメッセージ
! Bad mathchar (34560).
\bm@command ->\mathchar 34560
推測なのですが、\DeclareMathSymbolの第1引数のシングルクォーテーションとバッククォートとbmパッケージの組み合わせが原因なのではとみております。
なぜこのような事がおこるのでしょうか。
よろしくお願いします。
数式まわりはサッパリなのですが、だれも回答していないので……
bm パッケージはシングルクォーテーション (') の \mathcode が "8000 であることを前提としているが、
\DeclareMathSymbol によってシングルクォーテーションの \mathcode が "8000 以外に変更されてしまっているから。
ではないかと思います。
bm パッケージが LaTeX Project によってメンテナンスされていることを考えると、
\DeclareMathSymbol でシングルクォーテーションの定義を変更することは
「LaTeX でやってはいけないこと」になるのではないかと思います。
----
以下 bm.dtx の該当部分です。mathcode が "8000 かどうかの判定のために \mathcode`\' と比較をしています。
% \changes{v1.0d}{1997/11/15}
% {New active \cs{mathcode} code.}
% Character token.
% If it is of catcode 11 or 12, get its mathcode.
% If that is |"8000| replace the token by its active version, and then
% let bm expansion look again at the character. Being really active
% this time, it will expand away (probably).
%
% If the previous token was |\left| or |\right|, get the delcode
% instead of the mathcode.
% \begin{macrocode}
\else\ifcat.\ifcat a#1.\else#1\fi
\count@\mathcode`#1\relax
\ifnum\count@=\mathcode`\'%
\begingroup\uccode`\~`#1\uppercase{\endgroup
\def\bm@next{\bm@expand~}}%
\else
\ifx\bm@previous\left
\count@\delcode`#1\relax
\bm@delimiter
\else
% \end{macrocode}
bm パッケージはシングルクォーテーション (') の \mathcode が "8000 であることを前提としているが、
\DeclareMathSymbol によってシングルクォーテーションの \mathcode が "8000 以外に変更されてしまっているから。
ではないかと思います。
bm パッケージが LaTeX Project によってメンテナンスされていることを考えると、
\DeclareMathSymbol でシングルクォーテーションの定義を変更することは
「LaTeX でやってはいけないこと」になるのではないかと思います。
----
以下 bm.dtx の該当部分です。mathcode が "8000 かどうかの判定のために \mathcode`\' と比較をしています。
% \changes{v1.0d}{1997/11/15}
% {New active \cs{mathcode} code.}
% Character token.
% If it is of catcode 11 or 12, get its mathcode.
% If that is |"8000| replace the token by its active version, and then
% let bm expansion look again at the character. Being really active
% this time, it will expand away (probably).
%
% If the previous token was |\left| or |\right|, get the delcode
% instead of the mathcode.
% \begin{macrocode}
\else\ifcat.\ifcat a#1.\else#1\fi
\count@\mathcode`#1\relax
\ifnum\count@=\mathcode`\'%
\begingroup\uccode`\~`#1\uppercase{\endgroup
\def\bm@next{\bm@expand~}}%
\else
\ifx\bm@previous\left
\count@\delcode`#1\relax
\bm@delimiter
\else
% \end{macrocode}
本件でやりたいことは、基本的に「数式中の『,』直後のアキを少し増やしたい」だと思います。
プリアンブルに書かれているTeXコードがよく分からずに書かれて、bmパッケージと衝突するぐらいでしたら、
本件の場合は、単純に \thinskip の値を変えるほうがまだ現実的だと思います。
以下のLaTeX文章をご検討ください。
%#!ptex2pdf -l -u d3679
\documentclass[dvipdfmx]{ujarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{bm}
\thinmuskip = 6mu %default: 3mu
% \medmuskip = %default: 4mu plus 2mu minus 4mu
% \thickmuskip= %default: 5mu plus 5mu
%% 必要であれば、いくつかの数式関連コマンドも手当てする
% \DeclareRobustCommand\mathellipsis{\mathinner{{\ldotp\mskip3mu}{\ldotp\mskip3mu}{\ldotp}}}
% \DeclareRobustCommand\cdots{\mathinner{{\cdotp\mskip3mu}{\cdotp\mskip3mu}{\cdotp}}}
\begin{document}
\thinmuskip = 3mu
$a,a$
$a,\bm{,}a$
a,a a, a
\thinmuskip = 6mu
$a,a$
$a,\bm{,}a$
a,a a, a
\end{document}
プリアンブルに書かれているTeXコードがよく分からずに書かれて、bmパッケージと衝突するぐらいでしたら、
本件の場合は、単純に \thinskip の値を変えるほうがまだ現実的だと思います。
以下のLaTeX文章をご検討ください。
%#!ptex2pdf -l -u d3679
\documentclass[dvipdfmx]{ujarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{bm}
\thinmuskip = 6mu %default: 3mu
% \medmuskip = %default: 4mu plus 2mu minus 4mu
% \thickmuskip= %default: 5mu plus 5mu
%% 必要であれば、いくつかの数式関連コマンドも手当てする
% \DeclareRobustCommand\mathellipsis{\mathinner{{\ldotp\mskip3mu}{\ldotp\mskip3mu}{\ldotp}}}
% \DeclareRobustCommand\cdots{\mathinner{{\cdotp\mskip3mu}{\cdotp\mskip3mu}{\cdotp}}}
\begin{document}
\thinmuskip = 3mu
$a,a$
$a,\bm{,}a$
a,a a, a
\thinmuskip = 6mu
$a,a$
$a,\bm{,}a$
a,a a, a
\end{document}
標準的なパッケージであるbmはLaTeXの標準を前提につくるでしょう.
デフォルトのものを書き直すときは,ものすごく慎重になるか
改変部分は特定のスコープに閉じ込めるとかしないと怖くてやってられません.
primeに関しては「f'」できちんと「f^{\prime}」にならないと,
Taylor展開とかいっぱい書くときに病みそうになります(苦笑).
たまに,「f^'」という謎入力をしてあってそのまま本や論文になってそうなのもありますが
もしかして,「f^'」と入力したいとか?
本題.
もしかして,プリアンブルに
\def\var@active@math@prime{\bgroup\prim@s}%% \active@math@prime から ^ をとった
{\catcode`\'=\active \global\let'\var@active@math@prime}%
を追加するだけでOKかもしれません.上付きがいやなら
\active@math@primeから「^」を削除するというだけです.
#試験してません.
デフォルトのものを書き直すときは,ものすごく慎重になるか
改変部分は特定のスコープに閉じ込めるとかしないと怖くてやってられません.
primeに関しては「f'」できちんと「f^{\prime}」にならないと,
Taylor展開とかいっぱい書くときに病みそうになります(苦笑).
たまに,「f^'」という謎入力をしてあってそのまま本や論文になってそうなのもありますが
もしかして,「f^'」と入力したいとか?
本題.
もしかして,プリアンブルに
\def\var@active@math@prime{\bgroup\prim@s}%% \active@math@prime から ^ をとった
{\catcode`\'=\active \global\let'\var@active@math@prime}%
を追加するだけでOKかもしれません.上付きがいやなら
\active@math@primeから「^」を削除するというだけです.
#試験してません.
エラーの原因がわかったので下記のようにサンプルを作りました。
目的はシングルクォーテーション「'」で上付ではない\primeを実現させたいのです。
\bmコマンド外では目的の動作をしていますが、\bmコマンド内では上付になってしまいました。
この原因がわかるでしょうか?
よろしくお願いします。
\documentclass[dvipdfmx]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{bm}
\catcode`\'=\active
\gdef'{\prime}
\begin{document}
$x'x^{\prime}\bm{x'x^{\prime}}$
\end{document}
目的はシングルクォーテーション「'」で上付ではない\primeを実現させたいのです。
\bmコマンド外では目的の動作をしていますが、\bmコマンド内では上付になってしまいました。
この原因がわかるでしょうか?
よろしくお願いします。
\documentclass[dvipdfmx]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{bm}
\catcode`\'=\active
\gdef'{\prime}
\begin{document}
$x'x^{\prime}\bm{x'x^{\prime}}$
\end{document}