\raggedright環境内で\indentコマンドを有効にしたい

\raggedright環境内で\indentコマンドを有効にしたい

- n k の投稿
返信数: 8
こんにちは。お世話になっております。

私は普段プリアンブルに\raggedrightと書いて文書を作成しているのですが、そうすると\indentと書いても字下げされません。なお、この場合\parで改段落した際に字下げされないのは希望通りであり問題ありません。デフォルトでは字下げなしで、字下げしたいところだけ\indentコマンドで字下げできるようにしたいというのが私の希望です。

この件について、これまで文頭を字下げしたいときは、「 」即ち全角スペースを入れていて、これで特段問題は生じていなかったのですが、やはりコード内に全角スペースを入れるのはあまりよくないかなあと先日思い立ち、この質問をするに至った次第です。

なお、\hspace{1zw}とするのも試したのですが、なぜか時々字下げ幅が若干ずれることがあり、この方法はとれません。仮にこの問題が解決したならば、
\renewcommand{\indent}{\hspace{1zw}}
などとすれば、一応\indentと打って字下げされるようになることは確認しています。…が、これはちょっとなあという気がしています。

この件についてネットで調べたところ、
https://tex.stackexchange.com/questions/185970/raggedright-removes-paragraph-indentation
こちらで最初に提案されている方法ですが、こうすると\parで改段落した際に自動で字下げされるようになってしまい、これは私の望むところではありません。
https://tex.stackexchange.com/questions/620664/how-can-i-use-raggedright-with-indent-of-1-27-cm-i-saw-a-post-about-this-somew
よってこちらの\raggedrightの後に\\setlength{\parindent}{}で字下げ幅を設定するというのも解決策にはなりません。

https://tex.stackexchange.com/questions/269909/what-is-the-purpose-of-raggedright
こちらもヒントになりそうですが、まだ解読できていません。

また上のサイトで挙げられている\ragged2eについては、少し調べたところ和文で使う場合に不具合があるとの記述を見つけたので、試していません。

ということで、\raggedright環境内で\indentコマンドを有効にする方法がありましたら教えてください。
よろしくお願いいたします。
n k への返信

Re: \raggedright環境内で\indentコマンドを有効にしたい

- 北見 けん の投稿
> なお、\hspace{1zw}とするのも試したのですが、なぜか時々字下げ幅が若干ずれることがあり、この方法はとれません。仮にこの問題が解決したならば、
> \renewcommand{\indent}{\hspace{1zw}}

この、「なぜか時々字下げ幅が若干ずれる」のサンプルはありますか?
北見 けん への返信

Re: \raggedright環境内で\indentコマンドを有効にしたい

- n k の投稿
ご返信ありがとうございます。
すみません、以前ずれたことがあって、それ以降全角スペースを使うようにしていたと思ったのですが、色々やってみたのですが字下げ幅がずれるのは再現できませんでした。申し訳ありません。

\renewcommand{\indent}{\hspace{1zw}}
で\indentコマンドが効くようにするという方法ですが、どう思いますでしょうか…?これで何も問題なければこれでいいのですが、ちょっと強引すぎるような気がして大丈夫かなと思っているのですが…

もちろん、当初の質問である、\raggedright環境内で\indentコマンドを有効にする方法は引き続き回答をお待ちしております。
よろしくお願いいたします。
n k への返信

Re: \raggedright環境内で\indentコマンドを有効にしたい

- 北見 けん の投稿
あらためて確認してみたら \hspace{1zw} でもずれたりすることはなかったので、それで満足ということですね。
\indent は TeX のプリミティブコマンドで、その時点での \parindent の値に応じた空白を開けて段落を開始する命令です。なので、LaTeX の内部でもそのような意図で使われているところがあるかもしれず、それに悪さをしてしまうかもしれません。\indent とは別の名前のマクロにする方が安心でしょう。
北見 けん への返信

Re: \raggedright環境内で\indentコマンドを有効にしたい

- 北見 けん の投稿
あと、こちらの「当初の質問である、\raggedright環境内で\indentコマンドを有効にする方法は引き続き回答を」のほうに明示的には答えていませんでした。

(1) \indent はその時点での \parindent の値に応じた空白を空けて段落を開始する TeX のプリミティブコマンドである。
(2) \par で改段落してから(文章を続けることで暗黙的に)次の段落が開始するときにも \parindent の値に応じた空白が置かれる。
(3) \parで改段落した際に字下げされないのは希望通り(=つまり、\raggedright で設定される \parindent=0pt のままにしておきたい)。

ということを考慮すると、「\indentコマンドを有効にする」というのが「\indent を本来の意味のまま使う」ということであれば、それは不可能だということになるでしょう。あとは、\indent を上書き定義するか、\indent とは別の名前のマクロを使うかということにいなると思います。\par を再定義するという方法も可能ですが、それは \indent を再定義するよりもさらに悪影響のリスクが増すと思います。
n k への返信

Re: \raggedright環境内で\indentコマンドを有効にしたい

- Z. R. の投稿
\renewcommand{\indent}{\hspace{1zw}}

この定義に関して自分が一番問題だと思うのは「このマクロが完全展開可能ではない」(\hspaceは「*付き」にできるので明らかに完全展開可能でない)ということです。\indentはプリミティブなので完全展開可能であり、そういう前提で書かれたTeXプログラムが存在するでしょう。従って、\indentの意味を完全展開可能でないマクロで置き換えるのはそのプログラムの動作を壊すことになり、それ自体が大きな問題であると自分は考えます。


もしかしたらこういう話が今は全く理解できないかもしれません。でも「\indentのような定義変更が本来想定されていないものを変更するのであれば、こういう事項もきちんと考慮する必要がある」ということは認識しておくべきだと思います。

Z. R. への返信

Re: \raggedright環境内で\indentコマンドを有効にしたい

- n k の投稿
北見 けん様、Z. R.様、ご回答ありがとうございます。

やはり
\renewcommand{\indent}{\hspace{1zw}}
は少しまずいですか。Z. R.様の仰せの危険性については、私がまだそこまで詳しくなく、仰せの通りあまりよく分かりませんが、やはり少し危ないということですよね。

ただこのためだけに例えば \jisage みたいなコマンドを新たに作るのも、コードがごちゃごちゃになっていきそうでちょっと…という感じなんですよね… \quad みたいなので1zwのスペースのコマンドでもあればよかったんですが…

まあ、また少し何か考えます。
お二方、ご回答ありがとうございました。まだ回答は絶賛募集中ですので、ご覧になられた方で何か対処法のアイデアがありましたらまたお教えください。
n k への返信

Re: \raggedright環境内で\indentコマンドを有効にしたい

- 北見 けん の投稿
> まだ回答は絶賛募集中ですので、ご覧になられた方で何か対処法のアイデアがありましたら

ということなのですが、これまで書いていただいたことを読む限り、ご要望の核心部分は

> ただこのためだけに例えば \jisage みたいなコマンドを新たに作るのも、コードがごちゃごちゃになっていきそうでちょっと…という感じなんですよね… \quad みたいなので1zwのスペースのコマンドでもあればよかったんですが…

に書かれた通り、要するに「(副作用の心配のない、)由緒正しい方法で実現したい」ということですよね。
これに対して、TeX(LaTeX)では、段落冒頭の字下げ幅をつかさどる由緒正しいパラメータは唯一 \parindent のみで、\par のあとで本文を入力したときに暗黙的に開始される段落冒頭の字下げ幅と \indent によって明示的に段落が開始されるときの字下げ幅を別々に設定することは、由緒正しい方法に限定するなら、それはできません。

\parindent の大きさによらずに字下げせずに段落を開始するための \noindent という命令もありますが、その度に明示的に与えなければいけないので、\par のあとで本文を入力したときに暗黙的に開始される段落冒頭に \noindent を入れたければ、\par を再定義する必要があり、由緒正しい方法とはいえなくなります。暗黙的に開始される段落冒頭の字下げをなくすには、他に、\everypar に字下げをキャンセルする細工を仕込むことでもできそうですが、これも由緒正しい方法とはいえなくなります。

結論としては、暗黙の段落開始の字下げを無しにして、\indent のときに特定の幅で字下げをするのは、由緒正しい方法では実現できないので、もしもやるなら、\indent を書き換えてしまうか、別の名前の新規マクロを作って使うか、\par を書き換えるか、\everypar に細工を仕込むか、ということになるでしょう。

\indent を書き換えてしまうことについて、Z. R.さんはマクロの完全展開可能性を特に気にされていましたが、n kさんのご希望が「由緒正しく」ということなのであれば、完全展開可能であろうとなかろうと、そもそも \indent を書き換えてしまうこと自体を避けるべきではないかと思います。やはり安全で簡単なのは、別の名前の新規マクロを使うことかなと思います。
北見 けん への返信

Re: \raggedright環境内で\indentコマンドを有効にしたい

- n k の投稿
詳しくありがとうございます。
とりあえず \zw などとでもして使おうかと思います。
ありがとうございました。