奥村先生の「LaTeX2e美文書作成入門・改訂第5版」のDVD-ROMからダウンロードしてTeXを使っております.
四則演算の等号(=)および,プラス記号(+)とマイナス記号(ー)が数多く入った数式に対して,
=を{=}に変え,かつ+を{+}に変え,同時に,ーを{ー}に変えて出力する TeX命令は存在しますか?
たとえば,$A=a+b-c+d-e+f-g+h$ を $A{=}a{+}b{-}c{+}d{-}e{+}f{-}g{+}h$ として出力する方法を教えて下さい.
{=},{+},{-}を一つ一つ書き込むのは,数が多くなると煩わしく思いますので,良い方法があれば教えて下さい.
よろしくお願いします.
可読性というのは大変に重要なものですので
エディタで置換するのが一番.
といいつつ.
#やってることは '(\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}
エディタで置換するのが一番.
といいつつ.
#やってることは '(\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}
》 エディタで置換するのが一番.
あるいはカナ漢字変換システム(今時は IME と呼ぶのでしょうか)に
単語登録してしまうとか、定型文をカーソル位置に挿入してくれる
クリップボード・ユーティリティーの類いを導入するとか。
また、使用しているエディターによっては定型文を貼り付ける機能を
持っているかもしれません。あるいは内容が「{+}」だけの
ファイルを作っておいてエディターのファイル挿入読込みの
機能を使うというのも一方かもしれません。
まあ、最終出力まで全部自分一人で完結するような文書を作って
いるのなら、本田さんの示してくださっているような
コード(さすがに巧妙ですなぁ)を使うって手も「あり」ですが…。
あるいはカナ漢字変換システム(今時は IME と呼ぶのでしょうか)に
単語登録してしまうとか、定型文をカーソル位置に挿入してくれる
クリップボード・ユーティリティーの類いを導入するとか。
また、使用しているエディターによっては定型文を貼り付ける機能を
持っているかもしれません。あるいは内容が「{+}」だけの
ファイルを作っておいてエディターのファイル挿入読込みの
機能を使うというのも一方かもしれません。
まあ、最終出力まで全部自分一人で完結するような文書を作って
いるのなら、本田さんの示してくださっているような
コード(さすがに巧妙ですなぁ)を使うって手も「あり」ですが…。
北見けん様
ご回答,ありがとうございます.質問の書き方が悪く,不明確でした.
あなたの言われる通り,
【二項演算子の両側に自動的に入るスペースを入れずに行の長さを縮めたい】ということです.
例えば,仮に,"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}
とした時と同じになるような方法があれば楽だと思ったのです.
何か,いい方法がありましたら,教えて下さい.
ご回答,ありがとうございます.質問の書き方が悪く,不明確でした.
あなたの言われる通り,
【二項演算子の両側に自動的に入るスペースを入れずに行の長さを縮めたい】ということです.
例えば,仮に,"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}
とした時と同じになるような方法があれば楽だと思ったのです.
何か,いい方法がありましたら,教えて下さい.
すでに解決済みなのにこちらの枝に続けるのはくどいかもしれませんが…
置換の組合せが多いなら、エディターのマクロ機能(秀丸については詳しく
ありませんが、確かかなり充実したプログラマブルなマクロ機能を備えていると
聞いています)か、sed ないし perl といったテキスト処理ツールを使ってみては
いかがでしょうか。
もちろん、マクロあるいはツールのスクリプトの文法や、呼び出し方を
学ぶ必要がありますが、個々の置換が単純なものなら、さして難しくは
ないでしょう。文書作成自体の効率に影響するほど多くの置換をする必要が
あるという現状からすれば、相当の効果が期待できると思います。
置換の組合せが多いなら、エディターのマクロ機能(秀丸については詳しく
ありませんが、確かかなり充実したプログラマブルなマクロ機能を備えていると
聞いています)か、sed ないし perl といったテキスト処理ツールを使ってみては
いかがでしょうか。
もちろん、マクロあるいはツールのスクリプトの文法や、呼び出し方を
学ぶ必要がありますが、個々の置換が単純なものなら、さして難しくは
ないでしょう。文書作成自体の効率に影響するほど多くの置換をする必要が
あるという現状からすれば、相当の効果が期待できると思います。
エディタよりも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) + "}";
}
末尾のマクロを自動起動マクロに登録すれば良いです.
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) + "}";
}
本田さんの方法で解決したようですが、
別の方法で作ってみたものがあるので、書き込んでみます。
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}
別の方法で作ってみたものがあるので、書き込んでみます。
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}
北見けん様
ご親切なご回答,ありがとうございます.
北見様の方法:
\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}
以上のソース・ファイルで,うまくいっております.
助かりました.ありがとうございました.
ご親切なご回答,ありがとうございます.
北見様の方法:
\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}
以上のソース・ファイルで,うまくいっております.
助かりました.ありがとうございました.