冪根の数字付きの\sqrtの再定義

冪根の数字付きの\sqrtの再定義

- ヤバルゴ mdl.2 の投稿
返信数: 9
美文書[第5版] P.103 『6.2 いろいろな記号』に書かれているマクロを利用し,\sqrt の根号を揃えた \ssqrt を定義しました.次のマクロです.
\newcommand{\ssqrt}[1]{\sqrt{\smash[b]{\mathstrut #1}}}

しかし,\ssqrt[2] のように冪根の数字を付けたとき,出力結果がおかしくなります.
この問題への対処をご教授ください.


以下がその例と結果(TeX2imgで作成した画像)です.

%----------------------
%% ドキュメントクラス
\documentclass[uplatex,dvipdfmx,a4paper,papersize,magstyle=real]{bxjsarticle}
\pagestyle{empty}

\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{mathtools} % include amsmath

%--冪根の数字を修正する(大きくする)--
%  https://okumuralab.org/tex/mod/forum/discuss.php?d=1857
\usepackage{etoolbox}
\makeatletter
\patchcmd{\plainroot@}{\scriptscriptstyle}{\scriptstyle}{}{}
\makeatother

% 美文書[第5版] P.103 『6.2 いろいろな記号』に書かれているマクロを利用した
\newcommand{\ssqrt}[1]{\sqrt{\smash[b]{\mathstrut #1}}}

\begin{document}

\begin{align*} % \sqrt …不揃いで美しくない
t&=\sqrt{g}+\sqrt{h} \\
&=\sqrt[2]{g}+\sqrt[2]{h}
\end{align*}
\begin{align*} % \ssqrt …美しくなるハズ
t&=\ssqrt{g}+\ssqrt{h} \\
&=\ssqrt[2]{g}+\ssqrt[2]{h} % アレ
\end{align*}

\end{document}
%----------------------
添付 equation.jpg
ヤバルゴ mdl.2 への返信

Re: 冪根の数字付きの\sqrtの再定義

- aminophen の投稿
\sqrt がとる「オプション引数」を正しく扱わないといけないです。

\newcommand{\ssqrt}[1]{\sqrt{\smash[b]{\mathstrut #1}}}

の代わりに

\newcommand{\ssqrt}[2][]{\sqrt[#1]{\smash[b]{\mathstrut #2}}}

とするとどうでしょうか。
# たぶん美文書の定義はオプション引数を想定していないと思う。
aminophen への返信

Re: 冪根の数字付きの\sqrtの再定義

- ヤバルゴ mdl.2 の投稿
回答ありがとうございます.

アセト アミノフェン さまの提示された方法で解決いたしました.ありがとうございました.



追記: \sqrt と \sqrt* で従来の根号と美文書の根号を切り替えるマクロを組んでみました.間違っておりましたら指摘してくださると幸いです.

\usepackage{letltxmacro}
\LetLtxMacro{\oldsqrt}{\sqrt}
\makeatletter
\renewcommand{\sqrt}{\@ifstar{\@ifnextchar[{\@oldsqrt}{\@oldsqrt[]}}{\oldsqrt}}
\newcommand{\@oldsqrt}[2][]{\oldsqrt[#1]{\smash[b]{\mathstrut #2}}}
\makeatother
添付 equation.jpg
ヤバルゴ mdl.2 への返信

Re: 冪根の数字付きの\sqrtの再定義

- ヤバルゴ mdl.2 の投稿
追記の追記:
アセト アミノフェン さまが,よりシンプルな回答に直してくださったようですので,私の追記した \sqrt* もシンプルなマクロに変えてみました.出力は先のものと同じです.

\usepackage{letltxmacro}
\makeatletter
\LetLtxMacro{\oldsqrt}{\sqrt}
\newcommand{\newsqrt}[2][]{\oldsqrt[#1]{\smash[b]{\mathstrut #2}}}
\renewcommand{\sqrt}{\@ifstar{\newsqrt}{\oldsqrt}}
\makeatother
ヤバルゴ mdl.2 への返信

Re: 冪根の数字付きの\sqrtの再定義

- aminophen の投稿
すみません、こっちのほうがスペースが入って綺麗ですね。

\newcommand{\ssqrt}[2][\ ]{\sqrt[#1]{\smash[b]{\mathstrut #2}}}

# さっき答えたときちゃんとコンパイル結果見てないのがバレたか…
aminophen への返信

Re: 冪根の数字付きの\sqrtの再定義

- ヤバルゴ mdl.2 の投稿
ご指摘のように変更すると,不自然だった等号直後の間隔が修正されますね.(言われるまで気がつきませんでした….)

%--最終的にこんな感じになった
\documentclass[uplatex,dvipdfmx,a4paper,papersize,magstyle=real]{bxjsarticle}
\pagestyle{empty}

\usepackage{lmodern}
\usepackage{mathtools} % include amsmath

%--冪根の数字を修正する(大きくする)--
%  https://okumuralab.org/tex/mod/forum/discuss.php?d=1857
\usepackage{etoolbox}
\makeatletter
\patchcmd{\plainroot@}{\scriptscriptstyle}{\scriptstyle}{}{}
\makeatother

%--マクロ--
\usepackage{letltxmacro}
\makeatletter
\LetLtxMacro{\oldsqrt}{\sqrt}
\newcommand{\newsqrt}[2][\ ]{\oldsqrt[#1]{\smash[b]{\mathstrut #2}}}
\renewcommand{\sqrt}{\@ifstar{\newsqrt}{\oldsqrt}}
\makeatother

\begin{document}

\begin{align*}
t&=\sqrt{g}+\sqrt{h} \\
&=\sqrt*{g}+\sqrt*{h} \\
t&=\sqrt[2]{g}+\sqrt[2]{h} \\
&=\sqrt*[2]{g}+\sqrt*[2]{h}
\end{align*}

\end{document}
添付 equation.jpg
ヤバルゴ mdl.2 への返信

Re: 冪根の数字付きの\sqrtの再定義

- 本田 知亮 の投稿
オプション引数に「\ 」をいれないと
詰まるのは,
たぶん,\newcommandが
何か副作用を起こしています.

「\ 」は本来の空きとは違うと思うので
場合によっては何か起こるかもしれません
#添え字になったときとか・・試してないけど

\newcommandの定義は追いかけてませんが
optionがない場合の展開のときに,
mathrel「=」の直後に
数式の要素とみなされうる何かを
置いてるのかなとは思います.

こういうときは,
ブラックボックス的な高レベルな記述より
低レベルな記述の方がみやすいかもしれません.

\def\newsqrt{\@ifnextchar[%]
{\@newsqrt}
{\@@newsqrt}
}
\def\@newsqrt[#1]#2{\oldsqrt[#1]{\smash[b]{\mathstrut #2}}}
\def\@@newsqrt#1{\oldsqrt{\smash[b]{\mathstrut #1}}}

本田 知亮 への返信

Re: 冪根の数字付きの\sqrtの再定義

- 前田 一貴 の投稿
蛇足っぽいですが,\sqrt[]{g} だと羃根の指数の位置調整で入る負の \mkern が悪さをするみたいです.

本田さんのと同じですが,xparse を使うとすっきりしますね.

\usepackage{xparse}
\DeclareDocumentCommand{\newsqrt}{ o m }{%
  \IfValueTF{#1}{\oldsqrt[#1]}{\oldsqrt}{\smash[b]{\mathstrut #2}}}
\renewcommand{\sqrt}{\@ifstar{\newsqrt}{\oldsqrt}}
前田 一貴 への返信

Re: 冪根の数字付きの\sqrtの再定義

- ヤバルゴ mdl.2 の投稿
本田 さま,前田 さま,回答ありがとうございます.

お二方の方法で,羃根の指数がないときの \sqrt および \sqrt* の横の出力位置が揃いました.

TeX言語を使った方法や比較的新しいパッケージを使った方法があり,興味深いです.



%-------------以下,実装例
% TeX言語による操作は怖いので,xparse を利用しました

%% ドキュメントクラス
\documentclass[uplatex,dvipdfmx,a4paper,papersize,magstyle=real]{bxjsarticle}
\pagestyle{empty}

\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{mathtools} % include amsmath

%--冪根の数字を修正する(大きくする)--
%  https://okumuralab.org/tex/mod/forum/discuss.php?d=1857
\usepackage{etoolbox}
\makeatletter
\patchcmd{\plainroot@}{\scriptscriptstyle}{\scriptstyle}{}{}
\makeatother


%--高さの統一した根号 \sqrt* 命令を追加する--
%  https://okumuralab.org/tex/mod/forum/discuss.php?d=1864
\usepackage{letltxmacro}
\usepackage{xparse}
\makeatletter
\LetLtxMacro{\oldsqrt}{\sqrt}
\DeclareDocumentCommand{\newsqrt}{o m}{%
  \IfValueTF{#1}{\oldsqrt[#1]}{\oldsqrt}{\smash[b]{\mathstrut #2}}%
}
\renewcommand{\sqrt}{%
  \@ifstar{\newsqrt}{\oldsqrt}%
}
\makeatother

\begin{document}

\begin{align*}
s&=\sqrt{g}+\sqrt{h} \\
s^\ast &=\sqrt*{g}+\sqrt*{h} \\
s[]&=\sqrt[2]{g}+\sqrt[2]{h} \\
s^\ast[] &=\sqrt*[2]{g}+\sqrt*[2]{h}
\end{align*}

\end{document}
添付 equation.jpg
前田 一貴 への返信

Re: 冪根の数字付きの\sqrtの再定義

- 本田 知亮 の投稿
>指数の位置調整で入る負の \mkern

あ,そうですね.カーンの類ですか
てっきり\newcommandかと
#\long付きがデフォルトなのがいやなので
#まず最初に疑ってしまう(^-^;;

昔のptexでも
和文+アクセント記号付きアルファベットだと
カーンの影響でグルーが入らないケースがありました.