記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 長島 隆廣 の投稿
返信数: 13
奥村先生の「LaTeX2e美文書作成入門・改訂第5版」のDVD-ROMからダウンロードしてTeXを使っております.

四則演算の等号(=)および,プラス記号(+)とマイナス記号(ー)が数多く入った数式に対して,
=を{=}に変え,かつ+を{+}に変え,同時に,ーを{ー}に変えて出力する TeX命令は存在しますか?

たとえば,$A=a+b-c+d-e+f-g+h$ を $A{=}a{+}b{-}c{+}d{-}e{+}f{-}g{+}h$ として出力する方法を教えて下さい.
{=},{+},{-}を一つ一つ書き込むのは,数が多くなると煩わしく思いますので,良い方法があれば教えて下さい.
よろしくお願いします.

長島 隆廣 への返信

Re: 記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 本田 知亮 の投稿
可読性というのは大変に重要なものですので
エディタで置換するのが一番.


といいつつ.
#やってることは '(\prime)の仕組みのまね.

\documentclass[a4j]{jarticle}

\makeatletter
\DeclareMathSymbol{\mathbin@pl}{\mathbin}{operators}{"2B}
\DeclareMathSymbol{\mathbin@mi}{\mathbin}{symbols}{"00}
\DeclareMathSymbol{\mathrel@eq}{\mathrel}{operators}{"3D}

\def\active@math@eq{\{\mathrel@eq\}}
\def\active@math@pl{\{\mathbin@pl\}}
\def\active@math@mi{\{\mathbin@mi\}}
\bgroup
\catcode`\=\active \global\let=\active@math@eq
\catcode`\+\active \global\let+\active@math@pl
\catcode`\-\active \global\let-\active@math@mi
\egroup

\mathcode`\="8000 % =
\mathcode`\-"8000 % -
\mathcode`\+"8000 % +

\makeatother

\begin{document}
\verb|$A=a+b-c+d-e+f-g+h$|:$A=a+b-c+d-e+f-g+h$
\par
\verb|$A{=}a{+}b{-}c{+}d{-}e{+}f{-}g{+}h$|:$A{=}a{+}b{-}c{+}d{-}e{+}f{-}g{+}h$
\end{document}
本田 知亮 への返信

Re: 記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 帯田 木偶太 の投稿
》 エディタで置換するのが一番.

あるいはカナ漢字変換システム(今時は IME と呼ぶのでしょうか)に
単語登録してしまうとか、定型文をカーソル位置に挿入してくれる
クリップボード・ユーティリティーの類いを導入するとか。
また、使用しているエディターによっては定型文を貼り付ける機能を
持っているかもしれません。あるいは内容が「{+}」だけの
ファイルを作っておいてエディターのファイル挿入読込みの
機能を使うというのも一方かもしれません。

まあ、最終出力まで全部自分一人で完結するような文書を作って
いるのなら、本田さんの示してくださっているような
コード(さすがに巧妙ですなぁ)を使うって手も「あり」ですが…。
帯田 木偶太 への返信

Re: 記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 北見 けん の投稿
ちょっと確認させてください。
ソースファイル中で $a{+}b$ とやっても、
ブレイスは TeX のグルーピングの意味で、
ブレイスが出力されるわけではないので、
やりたいことは、
二項演算子の両側に自動的に入るスペースを入れずに行の長さを縮めたい、
ということでしょうか。

それとも $a\{+\}b$ としたときのように、
ブレイスも出力させたいのでしょうか。
北見 けん への返信

Re: 記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 本田 知亮 の投稿
>ブレイスも出力させたいのでしょうか。

あっ,そーか.そういう意味か!

{+}を出力させるのではなく,
{+}として処理させたいということですか.

それなら問答無用で
\thickmuskip0mu
\medmuskip0mu
\thinmuskip0mu
を叩き込めばいいとかいうそういう話?

もしくは・・・

def\active@math@eq{{\mathrel@eq}}
\def\active@math@pl{{\mathbin@pl}}
\def\active@math@mi{{\mathbin@mi}}

にすれば,詰まります.
北見 けん への返信

Re: 記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 長島 隆廣 の投稿
北見けん様
ご回答,ありがとうございます.質問の書き方が悪く,不明確でした.
あなたの言われる通り,
【二項演算子の両側に自動的に入るスペースを入れずに行の長さを縮めたい】ということです.

例えば,仮に,"mspace"というような環境があって,
\begin{equation}
\begin{mspace}
A=a+b-c+d-e+f-g+h
\end{mspace}
\end{equation}
としてコンパイルすると,出力結果が
\begin{equation}
A{=}a{+}b{-}c{+}d{-}e{+}f{-}g{+}h
\end{equation}
とした時と同じになるような方法があれば楽だと思ったのです.

何か,いい方法がありましたら,教えて下さい.
帯田 木偶太 への返信

Re: 記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 長島 隆廣 の投稿
帯田 木偶太 様

エディタでの置換は,すでにやっているのですが,和文置換も含まれていて,
登録語数が多すぎるため,何年も前から非能率的になっています.
したがって,エディタでの置換は減らしたいぐらいです.
因みに,エディタは「秀丸」を使用しています.

ご投稿ありがとうございました.
長島 隆廣 への返信

Re: 記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 帯田 木偶太 の投稿
すでに解決済みなのにこちらの枝に続けるのはくどいかもしれませんが…

置換の組合せが多いなら、エディターのマクロ機能(秀丸については詳しく
ありませんが、確かかなり充実したプログラマブルなマクロ機能を備えていると
聞いています)か、sed ないし perl といったテキスト処理ツールを使ってみては
いかがでしょうか。

もちろん、マクロあるいはツールのスクリプトの文法や、呼び出し方を
学ぶ必要がありますが、個々の置換が単純なものなら、さして難しくは
ないでしょう。文書作成自体の効率に影響するほど多くの置換をする必要が
あるという現状からすれば、相当の効果が期待できると思います。
帯田 木偶太 への返信

Re: 記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 長島 隆廣 の投稿
帯田 木偶太 様

秀丸エディタは,十年以上前から使っておりますが,sed や perl のテキスト処理ツールは使ったことがありませんので,一度,試してみようと思います.
ご指導,ありがとうございました.
長島 隆廣 への返信

Re: 記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 阿部 紀行 の投稿
エディタよりもTeXで行う方を望まれているようですので,以下は希望にそったものにはならないと思いますが.キーボードからの+という入力を{+}に自動で変換するということは可能です.(数式内のみで,ということでしたら,エディタの設定で数式内に色をつけるようにして,マクロ側でもそれを反映するようにすればできるでしょう.)

末尾のマクロを自動起動マクロに登録すれば良いです.
1. 末尾のマクロを適当なファイルに保存する.拡張子は.mac.
2. メニューから,マクロ→マクロ登録と選び,左の欄から自動起動を選ぶ.
3. 編集後タイマー(5)にチェックを入れ,... というボタンを押して1のファイルを選ぶ.その右は「0ms」を選ぶ.
4. 拡張子が.texのファイルを開き,+を入力すると{+}になる.

---------------------------

// マクロここから
if(filetype != ".tex")endmacro;
disableerrormsg;
if(event != 5)endmacro;
if(geteventparam(0) != 0)endmacro;
if(geteventparam(1) != 0)endmacro;
if(geteventparam(2) != 0)endmacro;
if(geteventparam(5) != 0)endmacro;

##c = geteventparam(4);
if(##c == '+' || ##c == '-' || ##c == '='){
undo;
insert "{" + char(##c) + "}";
}


阿部 紀行 への返信

Re: 記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 長島 隆廣 の投稿
阿部 紀行 様

ご投稿,ありがとうございます.
よい参考になりました.
他の事にも使えそうです.
過去にも,色々と教えて頂き,感謝いたしております.
本田 知亮 への返信

Re: 記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 長島 隆廣 の投稿
本田知亮様
二度にわたるご投稿,ありがとうございます.
投稿内容を,ゆっくり検討してみます.
長島 隆廣 への返信

Re: 記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 北見 けん の投稿
本田さんの方法で解決したようですが、
別の方法で作ってみたものがあるので、書き込んでみます。

mathcode を変えて、
二項演算子を通常文字にしてしまうものです。

数式中の空白挿入処理については、『TeXbook』の17,18章に書いてあります。

例えば“+”記号の mathcode は、16進で "202B です。
この最初の桁の2が二項演算子(クラス2)であることを表しています。
(ここでは関係ありませんが、続く桁はフォントファミリ、下二桁は文字コードです)

二項演算子でなく通常文字(クラス0)にしてしまえば、
周囲に空白が入らないようになりますから、
\mathcode`\+="002B
と定義し直せばよさそうです。

同様に“-”記号や“=”記号についても mathcode を調べて、

\mathcode`\-="0200 %(元は"2200)
\mathcode`\=="003D %(元は"303D)

のようにすれば、空白が挿入されなくなります。

ただ、下のソースでは、
mathcode の16進4桁目をマスクして0にする部分をマクロ化して、
汎用的に処理してみました。

\documentclass{article}

\def\makecharord#1{%
\count0=\mathcode`#1\relax
\divide\count0 by 4096
\multiply\count0 by -4096
\advance\count0 by \mathcode`#1\relax
\mathcode`#1=\count0
}

\newenvironment{compressed}{%
%\mathcode`\+="002B %(元は"202B)
%\mathcode`\-="0200 %(元は"2200)
%\mathcode`\=="003D %(元は"303D)
\makecharord\+
\makecharord\-
\makecharord\=
}{}

\begin{document}

\let\mspace\compressed % 環境名が気になったので、あえて違う環境名にしました。

例えば,仮に,"mspace"というような環境があって,
\begin{equation}
\begin{mspace}
A=a+b-c+d-e+f-g+h
\end{mspace}
\end{equation}
としてコンパイルすると,出力結果が
\begin{equation}
A{=}a{+}b{-}c{+}d{-}e{+}f{-}g{+}h
\end{equation}
とした時と同じになるような方法があれば楽だと思ったのです.

\end{document}
北見 けん への返信

Re: 記号=を{=},+を{+},ーを{ー}に変えて出力するマクロはありますか?

- 長島 隆廣 の投稿
北見けん様

ご親切なご回答,ありがとうございます.
北見様の方法:

\def\makecharord#1{%
\count0=\mathcode`#1\relax
\divide\count0 by 4096
\multiply\count0 by -4096
\advance\count0 by \mathcode`#1\relax
\mathcode`#1=\count0
}

\newenvironment{compressed}{%
%\mathcode`\+="002B %(元は"202B)
%\mathcode`\-="0200 %(元は"2200)
%\mathcode`\=="003D %(元は"303D)
\makecharord\+
\makecharord\-
\makecharord\=
}{}

を,そのまま"kkcompressedtn.sty"という名のスタイルファイルにして使っております.

\documentclass{jarticle}
\usepackage{kkcompressedtn}%% =,+,ー を{=},{+},{ー}に変えるスタイルファイル.

\begin{document}

\begin{equation}
\begin{compressed}
A=a+b-c+d-e+f-g+h
\end{compressed}
\end{equation}

としてコンパイルすると,出力結果が
\begin{equation}
A{=}a{+}b{-}c{+}d{-}e{+}f{-}g{+}h
\end{equation}
とした時と同じになるような方法があれば楽だと思ったのです.

以下の一式は"compressed"環境を使わないテスト!

\begin{equation}
A=a+b-c+d-e+f-g+h
\end{equation}

以下の式は,文章中に入れた例である.
$
\begin{compressed}
A=a+b-c+d-e+f-g+h
\end{compressed}
$
この様に文章中に入る.

\end{document}

以上のソース・ファイルで,うまくいっております.
助かりました.ありがとうございました.