enumerate環境で, \itemの途中から行を揃えて出力したいです. 先に添付ファイルを見ていただくとやりたいことが伝わるかもしれません.
split環境のように&を使ってそろえることができたらよいのですが, わかりませんでした.
そこで, 添付ファイルのように左側の文字数(正確にはバイト数)をカウントして, 適切な\vspaceを入れればよいのではないかと考えました.
lualatexのluaコードを使って挑戦してみましたが, 添付ファイルの通り微妙にずれてしまいます.
プログラミング自体全くの初心者なため, あまり良いコードではないと思います. 今回は下記のサイトを参考に書かせてもらいました,
https://qiita.com/zr_tex8r/items/af2905bc93ac2c936a67
この方法に限らず, 「\itemの途中から行を揃えて出力」をする方法を教えていただけないでしょうか. 回答のほどどうぞよろしくお願いいたします.
◆添付ファイルでのずれ対策
私は、よく
\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 など で一つの箱化
にして横並びにすることかな。
私は、よく
\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 など で一つの箱化
にして横並びにすることかな。
ご回答ありがとうございます.
返信が遅れてしまい, 申し訳ありません.
ご回答の通り, \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}
返信が遅れてしまい, 申し訳ありません.
ご回答の通り, \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}
気にならなければ良いのですが...
問題点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 番号をもとにした番号表示も可能です。
問題点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 番号をもとにした番号表示も可能です。
お返事ありがとうございます. 関数まで書いてくださり, 大変助かります.
\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}
\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}
間違ったことを書いていたので訂正です 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 も最新を使えるようになるのですが
(近い将来、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 も最新を使えるようになるのですが
# もうご覧になっていないかも知れませんが:
(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}
(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}
すでに解決したようですが、別解として。
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*}
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*}