enumerate環境における行揃え

enumerate環境における行揃え

- significant kkom の投稿
返信数: 11
enumerate環境で, \itemの途中から行を揃えて出力したいです. 先に添付ファイルを見ていただくとやりたいことが伝わるかもしれません.

split環境のように&を使ってそろえることができたらよいのですが, わかりませんでした.
そこで, 添付ファイルのように左側の文字数(正確にはバイト数)をカウントして, 適切な\vspaceを入れればよいのではないかと考えました.
lualatexのluaコードを使って挑戦してみましたが, 添付ファイルの通り微妙にずれてしまいます.
プログラミング自体全くの初心者なため, あまり良いコードではないと思います. 今回は下記のサイトを参考に書かせてもらいました,

https://qiita.com/zr_tex8r/items/af2905bc93ac2c936a67

この方法に限らず, 「\itemの途中から行を揃えて出力」をする方法を教えていただけないでしょうか. 回答のほどどうぞよろしくお願いいたします.
significant kkom への返信

Re: enumerate環境における行揃え

- 和田 勇 の投稿
◆添付ファイルでのずれ対策

私は、よく
     \item XXX \hfill
とか   \item XXX \hfill \makebox[35mm]{}
のような形でlatex 任せにします。
\hfill の代わりに \dotfill もよく使います。

◆\itemの途中から行を揃えて出力

私だったら 左側に必要な幅を持つ \par\makebox[幅]{} と
minipage や parbox などを併用します。
 \item XXXX
   念の為改行か \par を入れておく
  \makebox[幅]{}「minipage や parboxなどの記述」

場合によっては、tabular などの表を使う時もあります。

ポイントは、
  インデントしたい幅分の空白の箱と、
  インデントする部分を minipage parbox など で一つの箱化
にして横並びにすることかな。


和田 勇 への返信

Re: enumerate環境における行揃え

- significant kkom の投稿
ご回答ありがとうございます.
返信が遅れてしまい, 申し訳ありません.

ご回答の通り, \enumerate環境内で\minipageを使うことで望んだ出力が得られました.
この手法の方がより簡単でよいですね. 勉強になりました.

ありがとうございました.

最後にコードを載せておきます,

\documentclass[a4paper,11pt]{ltjsarticle}
%
\usepackage[margin=20truemm]{geometry}%空白調整
%
\newcommand{\contents}[2]{
\begin{minipage}[b]{0.6\columnwidth}
#1
\end{minipage}
\begin{minipage}[b]{0.4\columnwidth}
#2
\end{minipage}
}
%
\begin{document}
%
\begin{enumerate}
\item \contents{hogehoge報告書}{1部}
\item \contents{hogehoge報告書 別紙}{1部}
\item \contents{fugafuga依頼書}{1部}
\end{enumerate}
%
\end{document}
significant kkom への返信

Re: enumerate環境における行揃え

- 和田 勇 の投稿
気にならなければ良いのですが...

問題点1 警告メッセージ Overfull

list環境のラベル部分(この場合 「1.」とかの部分)を
考慮せずにcolumnwidth幅分使っているので、
overfull 警告メッセージが出ますね。
横幅一杯使いたいなら、
少なくとも一箇所は伸び縮み可能なものを挟むと良いでしょう

問題点2 「部」の部分
提示された内容を見ると2番目の「1部」は
どちらかというと右詰の方が良いかな?
言いたいことは11部のように二桁のデータが来ると
見栄えが悪くなります。

私案1
一行で済むなら、もう一個幅のある見えない箱を配置したらどうかな?
具体的には ...
 1個目と2個目は伸び縮み可能なバネの \fill で繋げ、
 2番目と3番目は離れない
ようにしたらどうかな、以下のような感じです。
ツッコミどころはあるのですが、ほぼほぼ使えると思います。

    {#1 ~ \hfill ~ #2~\makebox[3cm]{}}

私案2 tabular 関連パッケージを利用してみてはどうかな

最近の texlive には通常インストールされる
tabularray というパッケージを使うと,
処理している場所での横幅から 1X 2X 3X 5X 8X のような
カラム指定すると 1/19 2/19.... 8/19 にカラム幅を自動計算してくれます。
また、enumerate のような row 番号をもとにした番号表示も可能です。
和田 勇 への返信

Re: enumerate環境における行揃え

- significant kkom の投稿
お返事ありがとうございます. 関数まで書いてくださり, 大変助かります.

\hfillと\makeboxを用いた手法を試してみました. こちらの方が部数が多くなっても見栄えが良いですね. 警告メッセージについてはあまり気にしていませんでしたが, 無いに越したことはないですね. こちらの関数を使わせていただきます.

tabularパッケージについては私のPCに入っているのがtexlive2020であるため, 新しくする必要がありすぐには出来なさそうです. (windowsは2020 \rightarrow 2022のようにアップデートはできないのですね.) そのため, また後日挑戦してみようかと思います.

良い案を教えてくださり, ありがとうございました.

最後にコードを載せておきます,

\documentclass[a4paper,11pt]{ltjsarticle}
%
\usepackage[margin=20truemm]{geometry}%空白調整
%ver1 funtion
\newcommand{\contents}[2]{
\begin{minipage}[b]{0.6\columnwidth}
#1
\end{minipage}
\begin{minipage}[b]{0.4\columnwidth}
#2
\end{minipage}
}
%ver2 function
\newcommand{\contentsv}[2]{#1 \hfill #2 \makebox[5cm][l]{}}
%
\begin{document}
%ver1
\begin{enumerate}
\item \contents{hogehoge報告書}{1部}
\item \contents{hogehoge報告書 別紙}{12部}
\item \contents{fugafuga依頼書}{100部}
\end{enumerate}
%ver2
\begin{enumerate}
\item \contentsv{hogehoge報告書}{1部}
\item \contentsv{hogehoge報告書 別紙}{12部}
\item \contentsv{fugafugahogehoge依頼書}{100部}
\end{enumerate}
\end{document}
significant kkom への返信

Re: enumerate環境における行揃え

- 和田 勇 の投稿
間違ったことを書いていたので訂正です nX ではなく X[n] とのこと。
(近い将来、texlive をアップデートして tabularray が利用fr切るようになった時のために)

マニュアルを X.\d で検索してみると以下のように指定するそうです。

   Page 10: \begin{tblr}{|X[2,l]|X[3,l]|X[1,r]|X[r]|}
   Page 10: \begin{tblr}{|X[2,l]|X[3,l]|X[-1,r]|X[r]|}
   Page 10: \begin{tblr}{width=0.8\linewidth,colspec={|X[2,l]|X[3,l]|X[-1,r]|X[r]|}}
   Page 25: \begin{tblr}{width=0.8\textwidth, colspec={|l|X[2]|X[3]|X[-1]|}}

カウントアップ番号については、当フォーラムの検索窓に tabularray を入れて探してみてください。

PS1 「-1 」ってのもできるだ ... 今度試してみよっと。
PS2 ユーザ領域にインストールして良いのなら「インストールディレクトリ」を変更すれば
  TeXlive も最新を使えるようになるのですが  
和田 勇 への返信

Re: enumerate環境における行揃え

- significant kkom の投稿
ご返信ありがとうございます.

訂正ありがとうございます.
本質問からずれてしまうのであまり良くないと思いますが, texlive2020 \righarrow texlive2022の移行について少し聞かせてください.

インストールディレクトリとは C:\texlive というものでしょうか. また具体的な操作は" https://phst.hateblo.jp/entry/2021/05/09/180000"の方がやっていることでしょうか.

本題からズレた質問となってしまいましたが, 回答のほどよろしくお願いします.
significant kkom への返信

Re: enumerate環境における行揃え

- ut の投稿
# もうご覧になっていないかも知れませんが:

(1)question.tex で lua で書かれているものは、LaTeX の範囲でも
   実現できそうです。

(2)\columnwidth だと overfull になりますが、list 環境内の行長
   は \linewidth とするとよさそうです。

(3)\item の各項目がそんなに長くないのであれば、minipage じゃ
   なくて、\makebox でもよさそうです。


\documentclass[draft]{jsarticle}

\begin{document}

\section{\LaTeX の範囲で書き直してみると…}

% from: question.tex
%
% \begin{luacode*}
%  function my_len(x)
%    tex.sprint(-60-3.85*string.len(x)/3)
%  end
% \end{luacode*}
% \newcommand{\mylen}[1]{%
%  \directlua{ my_len('#1')}%
% }

\newlength{\mywidth}

\newcommand{\myshift}[1]{%
  \settowidth{\mywidth}{#1}%
  \setlength{\mywidth}{-\mywidth}%
  \addtolength{\mywidth}{-60mm}%
  \hspace{\mywidth}%
}

\begin{enumerate}
\item hogehoge報告書
%\hspace{\mylen{hogehoge報告書}mm}\rightline{1部}
\myshift{hogehoge報告書}\rightline{1部}

\item hogehoge報告書 別紙
%\hspace{\mylen{hogehoge報告書 別紙}mm}\hspace{0.7mm}\rightline{1部}
\myshift{hogehoge報告書 別紙}\rightline{1部}

\item fugafuga依頼書
%\hspace{\mylen{fugafuga依頼書}mm}\rightline{1部}
\myshift{fugafuga依頼書}\rightline{1部}
\end{enumerate}


\section{columnwidthじゃなくてlinewidthにすれば…}

\newcommand{\myarrow}[1]{\leftarrowfill\makebox[1.2\width]{\texttt{#1}}\rightarrowfill}

\noindent
\texttt{textwidth = \the\textwidth}

\noindent\myarrow{textwidth}

\begin{enumerate}\ttfamily
\item columnwidth = \the\columnwidth
\item \makebox[\columnwidth]{\myarrow{columnwidth}}
\item linewidth = \the\linewidth
\item \makebox[\linewidth]{\myarrow{linewidth}}
\end{enumerate}


\section{ボックスを並べるだけでもいいような…}

\begin{enumerate}
\item\makebox[4cm][l]{foo}\makebox[3cm][l]{qux}\makebox[3cm][r]{quux}
\item\makebox[4cm][l]{foobar}\makebox[3cm][l]{qux}\makebox[3cm][r]{corge}
\item\makebox[4cm][l]{foobarbaz}\makebox[3cm][l]{qux}\makebox[3cm][r]{grault}
\end{enumerate}

\end{document}
ut への返信

Re: enumerate環境における行揃え

- significant kkom の投稿
ご回答ありがとうございます.

(1)の\settowidthを使う方法は, 自分ではうまくいかず, 諦めてしまったものでしたので, すっきりしました.
(2)についてはlinewidthなど, witdhにもいろいろな種類があるんですね. 初めて知りました. いままで空白, 余白の管理についてあまりこだわりがなかったので, 勉強になりました.
(3)はその通りですね・・・ 私もboxを並べる手法を採用することにしました.

いろいろな手法を提案してくださり, ありがとうございました.
significant kkom への返信

Re: enumerate環境における行揃え

- 北見 けん の投稿
すでに解決したようですが、別解として。

enumerate 環境は文章で表現された箇条書きに番号をつけるものなので、単なる項目のリストアップであれば、表の中で項目番号をつけるだけのものを作るのがよいかなと思いました。表の桁揃えを tabular 環境に任せるものです。

\def\itemInTabular{\stepcounter{enumi}\theenumi.}
% enumerate 用の既存のカウンタを流用します。

\setcounter{enumi}{0}% リセットも手動で。

\begin{tabular}{l@{ }lr}
\itemInTabular&hogehoge報告書&1部\\
\itemInTabular&hogehoge報告書 別紙&1部\\
\itemInTabular&fugafuga依頼書&1部\\
\end{tabular}

\begin{tabular*}{0.7\textwidth}{l@{ }l@{\extracolsep{\fill}}r}
\itemInTabular&hogehoge報告書\hfil&1部\\
\itemInTabular&hogehoge報告書 別紙&1部\\
\itemInTabular&fugafuga依頼書&1部\\
\end{tabular*}
北見 けん への返信

Re: enumerate環境における行揃え

- significant kkom の投稿
ご回答ありがとうございます.

同じような出力でも, たくさんの手法があっておもしろいですね.
enumerate環境を使うことしか考えていなかったので, 感心しました.

ありがとうございました.
significant kkom への返信

Re: enumerate環境における行揃え

- 北見 けん の投稿
enumerateのような、段落を独自の形に整形する環境(list系環境)の中で、
さらに桁揃えのように段落の整形を重ねるのは扱いづらいので、
今後ここを読む他の方の役に立てばよいかなというつもりで書き込んだのでした。
すでに解決したことでしたのに返信のお手を煩わせてしまい、かえってすみませんでした。
ではでは。返信は無用です。