bmパッケージの利用

bmパッケージの利用

- 清水 の投稿
返信数: 7
\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パッケージの組み合わせが原因なのではとみております。 なぜこのような事がおこるのでしょうか。 よろしくお願いします。
清水 への返信

Re: bmパッケージの利用

- はやて (h20y6m) の投稿
数式まわりはサッパリなのですが、だれも回答していないので……

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}
はやて (h20y6m) への返信

Re: bmパッケージの利用

- 清水 の投稿
はやて様
ありがとうございます。
\mathcode が "8000 であることを前提なのですね。
\DeclareMathSymbol のあとに\mathcode`\'="8000で変更してあげればエラーはなくなりました。
清水 への返信

Re: bmパッケージの利用

- Yamamoto Munehiro "munepi" の投稿
本件でやりたいことは、基本的に「数式中の『,』直後のアキを少し増やしたい」だと思います。

プリアンブルに書かれている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}
Yamamoto Munehiro "munepi" への返信

Re: bmパッケージの利用

- 清水 の投稿
yamamoto様
ありがとうございます。
ただ、目的は「『,』直後のアキを少し増やしたい」ではありません。
\DeclareMathSymbol{'}{\mathord}{symbols}{"30}を宣言したら、bmパッケージと衝突したのでこの原因を知りたかったのです。
清水 への返信

Re: bmパッケージの利用

- 本田 知亮 の投稿
標準的なパッケージである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から「^」を削除するというだけです.

#試験してません.
清水 への返信

Re: bmパッケージの利用

- 清水 の投稿
エラーの原因がわかったので下記のようにサンプルを作りました。
目的はシングルクォーテーション「'」で上付ではない\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}
清水 への返信

Re: bmパッケージの利用

- 清水 の投稿
bm.styの
\def\bm@prime{^\bgroup
\let\bm@prime'%
\def\prim@s##1\relax{##1\futurelet\@let@token\pr@m@s}%
\prim@s}

こちらが原因だったようです。