summaryrefslogtreecommitdiff
path: root/biblio/pbibtex/pbibtex-manual/pbibtex-manual.tex
diff options
context:
space:
mode:
Diffstat (limited to 'biblio/pbibtex/pbibtex-manual/pbibtex-manual.tex')
-rw-r--r--biblio/pbibtex/pbibtex-manual/pbibtex-manual.tex234
1 files changed, 191 insertions, 43 deletions
diff --git a/biblio/pbibtex/pbibtex-manual/pbibtex-manual.tex b/biblio/pbibtex/pbibtex-manual/pbibtex-manual.tex
index b88387f012..1c1cde7aca 100644
--- a/biblio/pbibtex/pbibtex-manual/pbibtex-manual.tex
+++ b/biblio/pbibtex/pbibtex-manual/pbibtex-manual.tex
@@ -50,12 +50,6 @@
%%%%%%%%%%%%%%%%
% logos
-\def\eTeX{$\varepsilon$-\TeX}
-\def\pTeX{p\kern-.10em\TeX}
-\def\epTeX{$\varepsilon$-\pTeX}
-\def\upTeX{u\pTeX}
-\def\eupTeX{$\varepsilon$-\upTeX}
-
\def\JTeX{\leavevmode\textcompwordmark\lower.5ex\hbox{J}\kern-.17em\TeX}
\def\JBibTeX{\leavevmode\textcompwordmark\lower.5ex\hbox{J}\kern-.08em\BibTeX}
\def\pBibTeX{p\kern-.05em\BibTeX}
@@ -80,7 +74,7 @@
\title{\emph{\pBibTeX~/~\upBibTeX マニュアル}}
\author{日本語\TeX 開発コミュニティ\null
\thanks{\url{https://texjp.org},\ e-mail: \texttt{issue(at)texjp.org}}}
-\date{version 0.99d-j0.33,\today}
+\date{version 0.99d-j0.34,\today}
\maketitle
\pBibTeX と\upBibTeX は,それぞれ\pTeX と\upTeX と組み合わせて使用することを
@@ -121,28 +115,48 @@
\item 日本語文字とそれ以外の区別
\end{itemize}
-\subsection{多バイト文字の扱い}
+\subsection{多バイト文字の扱い}\label{sec:substring}
(u)\pBibTeX は,\BibTeX から最小の変更量で日本語を含む文献情報を
扱えるようにした都合上,多バイト文字の扱いは以下のとおりとなっている.
\begin{itemize}
\item \emph{文字列の位置や長さは「文字単位」ではなく「バイト単位」でカウントする}.
\item その結果として,開始位置や終了位置が多バイト文字の途中となる場合は,
- \emph{多バイト文字の途中で切られないように位置を調整して多めに切り出す}.
+ \emph{多バイト文字の途中で切られないように位置を調整する}.
\end{itemize}
具体的には,以下のスタイルパラメータが該当する.
\begin{itemize}
\item |substring$|\\
- 整数値2つ(長さ,開始位置)と文字列リテラル1つをpopし,
+ 整数値2つ(長さ,起点)と文字列リテラル1つをpopし,
指定の長さ(バイト長)の部分文字列をpushする組込関数である.
- \begin{itemize}
- \item 開始位置が多バイト文字の2バイト目以降であれば,1バイト目から取り出す.
- \item 終了位置が多バイト文字の最終バイトでなければ,最終バイトまで取り出す.
- \end{itemize}
- したがって,\pBibTeX (内部コード|euc|)では最大2バイト長く,
+ 起点に指定された整数値が正であれば文字列の先頭から,
+ 負であれば末尾から長さを数えて取り出す.
+
+ 多バイト文字についての開始・終了位置の調整は以下の順で行う.
+\begin{quotation}
+ \begin{enumerate}
+ \item[(1)] 開始位置が多バイト文字の2バイト目以降であれば,1バイト目から取り出す.
+ \item[(2)] 終了位置が多バイト文字の最終バイトでなければ,最終バイトまで取り出す.
+ \end{enumerate}
+\end{quotation}
+ したがって,この時点で\pBibTeX (内部コード|euc|)では最大2バイト長く,
\upBibTeX (内部コード|uptex|)では最大6バイト長い文字列が取り出されうる.
+ さらに,(u)\pBibTeX~j0.34 (\TeX~Live 2022)以降では% r62095 (2022-02-20)
+\begin{quotation}
+ \begin{enumerate}
+ \item[(3)] 起点が|#2|以上に指定されたにもかかわらず,上の(1)の調整により
+ 開始位置が文字列の先頭になってしまった場合は,
+ その先頭の多バイト文字を切り捨てる.
+ \item[(4)] 起点が|#-2|以下に指定されたにもかかわらず,上の(2)の調整により
+ 終了位置が文字列の末尾になってしまった場合は,
+ その末尾の多バイト文字を切り捨てる.
+ \end{enumerate}
+\end{quotation}
+ という調整も加えてある.したがって,\pBibTeX では最大1バイト短く,
+ \upBibTeX では最大3バイト短くなる(場合によっては空になる)ことがある.
+
\item |text.prefix$|\\
整数値(長さ)と文字列リテラルをpopし,文字列の先頭から指定の長さ(バイト長)の
連続した文字列をpushする組込関数である.
@@ -157,9 +171,34 @@
\pBibTeX と\upBibTeX では同じ文字でもバイト長が異なる場合があり,
その結果として取り出される見かけの文字数が異なることに注意.
-\pBibTeX (内部コード|euc|)の場合\par\medskip
+\par\medskip\noindent
+\begin{minipage}{0.45\textwidth}
+\begin{verbatim}
+例1:長めに調整(2)
+"あいうえお" #1 #1 substring$
+"あいうえお" #1 #2 substring$
+"あいうえお" #1 #3 substring$
+"あいうえお" #1 #4 substring$
+"あいうえお" #1 #5 substring$
+"あいうえお" #1 #6 substring$
+\end{verbatim}
+\end{minipage}
\begin{minipage}{0.5\textwidth}
+\begin{tabular}{lll}
+ & \pBibTeX & \upBibTeX \\
+最初の1文字 & 「あ」 & 「あ」 \\
+最初の2文字 & 「あ」 & 「あ」 \\
+最初の3文字 & 「あい」 & 「あ」 \\
+最初の4文字 & 「あい」 & 「あい」 \\
+最初の5文字 & 「あいう」 & 「あい」 \\
+最初の6文字 & 「あいう」 & 「あい」
+\end{tabular}
+\end{minipage}
+
+\par\medskip\noindent
+\begin{minipage}{0.45\textwidth}
\begin{verbatim}
+例2:長めに調整(1)
"あいうえお" #-1 #1 substring$
"あいうえお" #-1 #2 substring$
"あいうえお" #-1 #3 substring$
@@ -168,34 +207,88 @@
"あいうえお" #-1 #6 substring$
\end{verbatim}
\end{minipage}
-\begin{minipage}{0.4\textwidth}
-最後の1文字 = 「お」\par
-最後の2文字 = 「お」\par
-最後の3文字 = 「えお」\par
-最後の4文字 = 「えお」\par
-最後の5文字 = 「うえお」\par
-最後の6文字 = 「うえお」
-\end{minipage}\par\medskip
-
-\upBibTeX (内部コード|uptex|)の場合\par\medskip
\begin{minipage}{0.5\textwidth}
+\begin{tabular}{lll}
+ & \pBibTeX & \upBibTeX \\
+最後の1文字 & 「お」 & 「お」 \\
+最後の2文字 & 「お」 & 「お」 \\
+最後の3文字 & 「えお」 & 「お」 \\
+最後の4文字 & 「えお」 & 「えお」 \\
+最後の5文字 & 「うえお」 & 「えお」 \\
+最後の6文字 & 「うえお」 & 「えお」
+\end{tabular}
+\end{minipage}
+
+\par\medskip\noindent
+\begin{minipage}{0.45\textwidth}
\begin{verbatim}
-"あいうえお" #-1 #1 substring$
-"あいうえお" #-1 #2 substring$
-"あいうえお" #-1 #3 substring$
-"あいうえお" #-1 #4 substring$
-"あいうえお" #-1 #5 substring$
+例3:先頭文字の途中調整(3)
+"あいうえお" #1 #6 substring$
+"あいうえお" #2 #5 substring$
+"あいうえお" #3 #4 substring$
+"あいうえお" #4 #3 substring$
+"あいうえお" #5 #2 substring$
+"あいうえお" #6 #1 substring$
+\end{verbatim}
+\end{minipage}
+\begin{minipage}{0.5\textwidth}
+\begin{tabular}{lll}
+ & \pBibTeX & \upBibTeX \\
+最初の6文字 & 「あいう」 & 「あい」 \\
+最初の1文字を除く5文字 & 「いう」 & 「い」 \\
+最初の2文字を除く4文字 & 「いう」 & 「い」 \\
+最初の3文字を除く3文字 & 「いう」 & 「い」 \\
+最初の4文字を除く2文字 & 「う」 & 「い」 \\
+最初の5文字を除く1文字 & 「う」 & 「い」
+\end{tabular}
+\end{minipage}
+
+\par\medskip\noindent
+\begin{minipage}{0.45\textwidth}
+\begin{verbatim}
+例4:末尾文字の途中調整(4)
"あいうえお" #-1 #6 substring$
+"あいうえお" #-2 #5 substring$
+"あいうえお" #-3 #4 substring$
+"あいうえお" #-4 #3 substring$
+"あいうえお" #-5 #2 substring$
+"あいうえお" #-6 #1 substring$
\end{verbatim}
\end{minipage}
-\begin{minipage}{0.4\textwidth}
-最後の1文字 = 「お」\par
-最後の2文字 = 「お」\par
-最後の3文字 = 「お」\par
-最後の4文字 = 「えお」\par
-最後の5文字 = 「えお」\par
-最後の6文字 = 「えお」
-\end{minipage}\par\medskip
+\begin{minipage}{0.5\textwidth}
+\begin{tabular}{lll}
+ & \pBibTeX & \upBibTeX \\
+最後の6文字 & 「うえお」 & 「えお」 \\
+最後の1文字を除く5文字 & 「うえ」 & 「え」 \\
+最後の2文字を除く4文字 & 「うえ」 & 「え」 \\
+最後の3文字を除く3文字 & 「うえ」 & 「え」 \\
+最後の4文字を除く2文字 & 「う」 & 「え」 \\
+最後の5文字を除く1文字 & 「う」 & 「え」
+\end{tabular}
+\end{minipage}
+
+\par\medskip
+\begin{dangerous}
+ (u)\pBibTeX~j0.33 (\TeX~Live 2021)以前の|substring$|では,
+ オリジナルの\JBibTeX と同様,上記のうち調整(1)と(2)しか
+ 行っていなかった.すなわち「開始位置や終了位置が多バイトの文字の
+ 途中となる場合は,位置を調整して\emph{常に長めに切り出す}」という
+ 仕様であった.しかし,これでは
+\begin{verbatim}
+"(あいうえお" #2 global.max$ substring$ % 最初の1文字を除去したい
+"あいうえお)" #-2 global.max$ substring$ % 最後の1文字を除去したい
+\end{verbatim}
+ のような場合に文字を除去できず,例えば「|while$|ループ内で
+ |substring$|関数により文字列を1つずつ切り詰めて短くする処理」に
+ 和文文字リテラルが渡ると文字列が一向に短くならず,
+ 無限ループが起きてしまっていた\cite{tjb133}.
+ そこで,(u)\pBibTeX~j0.34 (\TeX~Live 2022)以降は調整(3)と(4)を加え,
+ \emph{カウント起点が「先頭の多バイト文字の途中」または「末尾の多バイト文字の
+ 途中」の場合に限って取り除くことで短めに切り出す}こととした.
+ なお,カウント終点側の多バイト文字については常に長めに切り出すし,
+ カウント起点が先頭でも末尾でもない多バイト文字の場合は長めに切り出す
+ という点は従来と同じである.上記の例を見るのが早いであろう.
+\end{dangerous}
\subsection{文字種が増えたことへの対応}
@@ -242,9 +335,54 @@
\end{itemize}
\end{itemize}
-(u)\pBibTeX 用のスタイルファイルでは,しばしば
+(u)\pBibTeX 用のスタイルファイルでは,しばしば著者名のフォーマットで
「日本人の姓名の間にはスペースを入れない」という挙動を実現するために
-|is.kanji.str$|関数が実用されている.
+|is.kanji.str$|関数が実用されているし,
+他にも``, et~al.''の代わりに「ほか」としたり``Vol.~2''の代わりに「第2巻」と
+したりといったローカライズにも多用されている.
+
+\begin{dangerous}
+ |is.kanji.str$|について,\pBibTeX は松井氏の\JBibTeX の仕様を踏襲している.
+ \upBibTeX のバージョンu1.27以降では上記の調整を行っているが,これは
+ \begin{itemize}
+ \item |is.kanji.str$|が「日本語文字」が
+ \emph{最低1つでも含まれていれば}真となること
+ \item 各種スタイルファイルで「著者名の文字列について
+ |is.kanji.str$|が真ならば姓名の間にスペースを入れないという
+ 使われ方が多いこと
+ \end{itemize}
+ を踏まえたものである.少なくともラテン文字(15)はASCIIの範囲(0--127)に
+ 収まらないが欧文扱いされたほうが都合がよいし,
+ さもないとErwin Schrödingerのような姓名の間のスペースが失われてしまう.
+ また,記号類(18)の一部は欧文の文脈で使われる可能性もある\footnote{さらに言えば
+ ギリシャ文字とキリル文字も一部JIS~X~0208に含まれ,(u)\pTeX の既定で和文扱い
+ される(いわゆる全角文字である)し,\upTeX での\.{kcatcode}はともに18で
+ 記号類と同じ扱いである(ちなみに\pTeX ではギリシャ文字は17,キリル文字は18).}.
+ 上記の調整を行うことで,文字列全体で見たときに「日本語の文脈なら真,
+ そうでなければ偽」となるので都合がよいという算段である.
+ なお,漢字・かな・ハングルの文字で真としているのは,日本人・中国人・韓国人の
+ 姓名の間にはスペースを入れない記法がよく行われることに依る.
+\end{dangerous}
+
+\subsection{その他詳細}\label{sec:jnewline}
+
+(u)\pBibTeX は,文献データベース(BIBファイル)を読み込んで文献リスト(BBLファイル)を
+出力するが,ファイルの行末の扱いは以下のとおりである.% r62001 (2022-02-08)
+\begin{itemize}
+ \item \emph{入力BIBファイル内}の改行は,(u)\pBibTeX では一律に半角空白と同様に扱われる.
+ すなわち,(u)\pTeX とは異なり\emph{日本語文字直後の改行も半角空白と等価である}.
+ \item \emph{BBLファイルの出力時}に,長いエントリを一行に出力するか複数行に分割するか決定
+ する場面において,オリジナルの\BibTeX は任意の半角空白を分割可能箇所とみなす
+ \footnote{\BibTeX~0.99c以前では半角空白以外の箇所も行末に\code{\%}を補って改行された
+ が,2010年の0.99dでURLなどの長い文字列を壊さないように半角空白以外での分割が
+ 禁止された.}が,(u)\pBibTeX~j0.34 (\TeX~Live 2022)以降は\emph{日本語文字の直後でない
+ 半角空白のみを分割可能箇所とみなす}.これは,元々BIBファイルにあった日本語文字直後の
+ 半角空白が仮にBBLファイルで改行に置換されれば,(u)\pTeX での読込時に「日本語文字直後の
+ 改行は空白を発生しない」という仕様により半角空白が消えてしまうためである\cite{tjb132}.
+ % ここでの「日本語文字」は\pBibTeX/\upBibTeX ともに単に「ASCIIの範囲(0--127)に
+ % 収まらない文字」としている(\upBibTeX でも|is.kanji.str$|のような調整は行わないし
+ % 敢えて改行を増やす必要はない).
+\end{itemize}
\section{コマンドラインオプション}
@@ -279,12 +417,16 @@
\item 2002年,アスキーにより|-kanji|オプションの追加 → \JBibTeX~0.33
\item 2009年,日本語\TeX 開発コミュニティが\JBibTeX をフォークし,\pBibTeX に改名
\item 2010年,\pBibTeX が\pTeX とともに\TL へ収録される.のちに\BibTeX~0.99d対応
+ \item 2012年,\upBibTeX が\upTeX とともに\TL へ収録される.
+ \item 2022年,出力BBLファイルでの行分割の改良(第\ref{sec:jnewline}節を参照)\\
+ |substring$|関数の改良(第\ref{sec:substring}節を参照) → \pBibTeX~j0.34
\end{itemize}
\JBibTeX は当初NTT \JTeX と組み合わせて使用することを想定して開発されたため,
文字コードに関する扱いにNTT \JTeX 由来のものが多かった.
-具体的には以下の機能があったが,コマンド名が|jbibtex|から|pbibtex|(\pTeX と同じ接頭辞)
-に改名された2009年に削除されている\cite{ptexlive}:
+これらはコマンド名が|jbibtex|から|pbibtex|(\pTeX と同じ接頭辞)
+に改名された2009年に削除された\cite{ptexlive}ため,\pBibTeX は\JBibTeX と
+以下の点で異なっている:
\begin{itemize}
\item JISコードにおいて日本語文字コード開始・終了を示す
種々のエスケープ・シーケンス(|ESC$@|と|ESC$B|,|ESC(J|と|ESC(B|など)を区別しない.
@@ -308,6 +450,12 @@
\bibitem{tjb109} Haruhiko Okumura,「upbibtexで名と姓の間のスペースが消える」,
2020/10/11,\\
\url{https://github.com/texjporg/tex-jp-build/issues/109}
+ \bibitem{tjb132} Hironobu Yamashita,「(u)pbibtexで和文文字直後の半角スペースで改行が起きる」,
+ 2022/02/07,\\
+ \url{https://github.com/texjporg/pbibtex-manual/issues/1}
+ \bibitem{tjb133} Hironobu Yamashita,「(u)pbibtex: freeze at en-dash etc. + sieicej.bst」,
+ 2022/02/19,\\
+ \url{https://github.com/texjporg/tex-jp-build/issues/133}
\end{thebibliography}
\end{document}