% \iffalse meta-comment % This is file `outoruby.dtx'. %% Copyright (c) 2025 kkotsi %% This file is distributed under the GNU General Public Licence Version 3. %% https://www.gnu.org/licenses/gpl-3.0.html %% Repository: https://codeberg.org/kkotsi/outoruby % % The outoruby package: Ruby with line break support for Japanese text. % % This package provides the \outoruby command, which support line breaks when typesetting ruby anotations. % It automatically switches between appropriate rubby form at the beginning and end of lines according to JIS X 4051 and JLReq. % This package depends on pxrubrica and supports any engine that it supports. % % To generate outoruby.sty, run the following command: % tex outoruby.dtx % To generate outoruby.pdf, run following commands (outoruby.sty needed): % uplatex outoruby.dtx % uplatex outoruby.dtx % uplatex outoruby.dtx % makeindex -s gind.ist outoruby.idx % makeindex -s gglo.ist outoruby.glo -o outoruby.gls % uplatex outoruby.dtx % uplatex outoruby.dtx % dvipdfmx outoruby % \fi % \makeatother %% %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} %% % \makeatletter % \CheckSum{1403} % % \iffalse %<*ins> \ifx\documentclass\undefined \input docstrip \askforoverwritetrue \AddGenerationDate \preamble \endpreamble \generate{% \file{outoruby.sty}{\from{outoruby.dtx}{pkg}}% } \expandafter\endbatchfile \fi %</ins> % %<*driver> \NeedsTeXFormat{LaTeX2e} \ProvidesFile{outoruby.dtx} %</driver> % \fi % % \@nameuse{@@sourcepart}\iffalse % % 残念ながら\LaTeX 限定。 % \begin{macrocode} %<pkg>\NeedsTeXFormat{LaTeX2e} %<pkg>\ProvidesPackage{outoruby} %<*pkg|driver> [2025/03/02 v0.0.0 ] %</pkg|driver> % \end{macrocode} % % \@nameuse{@@sourcepart}\fi % \@nameuse{@@sourcepartend} % % \iffalse %<*driver> \documentclass[dvipdfmx]{ujarticle} \makeatletter \usepackage[scale=0.924715,deluxe]{jlreq-deluxe}\normalfont\normalsize \usepackage{ajmacros} \newcommand\zw{zw} \setlength\emergencystretch{3em} \usepackage[T1]{fontenc} \usepackage{lmodern} \renewcommand*\rmdefault{lmr} \usepackage[scale=0.86,medium]{FiraSans} \renewcommand*{\ttdefault}{ntxtt} \DeclareFontShape{JY2}{hmc}{b}{n}{<->ssub*hmc/bx/n}{} \DeclareFontShape{JT2}{hmc}{b}{n}{<->ssub*hmc/bx/n}{} \DeclareFontShape{JY2}{hgt}{b}{n}{<->ssub*hgt/bx/n}{} \DeclareFontShape{JT2}{hgt}{b}{n}{<->ssub*hgt/bx/n}{} % 太字はゴシック \DeclareFontShape{JY2}{hmc}{bx}{n}{<->ssub*hgt/bx/n}{} \DeclareFontShape{JT2}{hmc}{bx}{n}{<->ssub*hgt/bx/n}{} % \setlength\topskip{1.5\zw} \setlength\baselineskip{1.75\zw} \setlength\columnsep{3\zw} \usepackage[ textwidth=47\zw, lines=46, left=12.2\zw, ]{geometry} \usepackage{pxeverysel,plext} \usepackage{multicol,color,graphicx,bm,amsfonts,array} \usepackage{booktabs,float,bxtexlogo,tasks,accsupp,fancyvrb,manfnt,needspace} \usepackage{etoolbox} \usepackage[verb]{bxghost} \usepackage{hypdoc} \AlsoImplementation \CodelineIndex \usepackage{footnotehyper,footnotebackref} \usepackage{pxjahyper} \usepackage{outoruby} %\usepackage{bxjaprnind} \catcode`\#=12 \@firstofone{\catcode`\#=6 \let\@@pxrr@compose@oneside@block@do\pxrr@compose@oneside@block@do \patchcmd\@@pxrr@compose@oneside@block@do{% \pxrr@evenspace@int{#1}\pxrr@boxr }{% \pxrr@evenspace@int{\pxrr@locate@inner}\pxrr@boxr }{% \newcommand\pxpatchon{% \let\pxrr@compose@oneside@block@do\@@pxrr@compose@oneside@block@do} }{% \let\@@pxrr@compose@block\pxrr@compose@block \patchcmd\@@pxrr@compose@block{% \pxrr@evenspace@int{#1}\pxrr@boxr }{% \pxrr@evenspace@int{\pxrr@locate@inner}\pxrr@boxr }{% \newcommand\pxpatchon{% \let\pxrr@compose@block\@@pxrr@compose@block} }{% Patch failed% }% } } \outorubyhyphenbreakable \def\em@@last#1{% \global\@namedef{em@@last@#1}{}} \begin{document} \DocInput{outoruby.dtx} \end{document} %</driver> % \fi % % \RecordChanges % \def\@@generalname:\ {}^^A 危険 % \def\generalname{\protect\@@generalname} % \changes{v0.0.0}{2025/03/02}{初版} % \DoNotIndex{ % \advance, \begingroup, \csname, \def, \edef, \else, \endgroup, \endcsname, \expandafter, % \fi, \if, \ifnum, \ifx, \let, \noexpand, % \relax, \the % } % % \frenchspacing % \setlength\emergencystretch{3em} % % \setlength\marginparwidth{12\zw} % \newcommand\marginfig[1]{\marginpar{^^A % \hskip2.5\zw % \advance\marginparwidth-3\zw % \parbox[b]{\marginparwidth}{^^A % #1}\hskip0.5\zw}} % % \def\texlevel{\leavevmode\marginpar{\hfill\dbend}} % \def\textexlevel{\leavevmode\marginpar{\hfill\dbend\dbend}} % % \DeclareRobustCommand\small{^^A % \@setfontsize\small\@ixpt{13.5}^^A % } % \DeclareRobustCommand\footnotesize{^^A % \@setfontsize\small\@viiipt{12}^^A % } % \setlength\footnotesep{8.6\p@} % \DeclareRobustCommand*\emph[1]{^^A % \relax\ifmmode \bm{#1}^^A % \else \textbf{\textgt{#1}}\fi} % % \renewcommand\contentsname{目次} % \renewcommand\abstractname{\outoruby{概要}{がい|よう}} % % \newcommand\jttdefault{\gtdefault} % \EverySelectfont{^^A % \begingroup % \edef\x{\f@family}^^A % \edef\y{\ttdefault}^^A % \edef\z{\k@family}^^A % \edef\a{\jttdefault}^^A % \expandafter\expandafter\expandafter\endgroup\ifx\x\y\ifx\z\a\else % \kanjifamily\jttdefault\selectfont % \fi\fi\relax % \setlength\kanjiskip{0pt plus 0.02\zw minus 0.02\zw}^^A % \setlength\xkanjiskip{0.25\zw plus 0.05\zw minus 0.10\zw}^^A % }\selectfont % % \renewcommand\quotation{^^A % \list{}{\listparindent1\zw\itemindent\listparindent % \rightmargin\leftmargin \parsep\z@ % \item\relax}} % \setlength\leftmargini{2\zw} % \edef\@listi{\@listi % \itemsep\z@ % \parsep\z@ % } % \let\@listI\@listi % % \renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}{^^A % 0.5\Cvs}{1sp}{\normalfont\normalsize\bfseries\gtfamily \noindent ■}} % % \newcommand\@@fnmark{\textsf{\textdagger}} % \renewcommand\@makefnmark{\null\hbox{\@textsuperscript{\normalfont\@@fnmark\@thefnmark}}\null} % \renewcommand\@makefntext[1]{\parindent1\zw % \leftskip1.75\zw % \noindent\hb@xt@\z@{\hskip-1\zw\relax % \hyperref[\BackrefFootnoteTag]{\@@fnmark\@thefnmark}\hss}\hskip1\zw\relax#1} % \renewcommand\footnoterule{^^A % \kern-3\p@ % \hrule\@width.333\columnwidth\@height0.4\p@ % \kern2.5\p@} % \setlength{\skip\footins}{1.75\zw\@plus5\p@\@minus5\p@} % % \newenvironment{fullwidth}{^^A % \list{}{^^A % \leftmargin-\marginparwidth % \advance\leftmargin-\marginparsep % \advance\leftmargin3\zw % \listparindent1\zw % }\item\relax % }{^^A % \endlist % } % % \clubpenalty\z@ % \widowpenalty\z@ % % \renewcommand\AltMacroFont{\MacroFont} % \CodelineNumbered % \setlength\MacroTopsep{2pt minus \z@}^^A macro環境前後のアキ % \def\linenumberstyle#1{{^^A % \rmfamily\scriptsize\color[gray]{0.5}^^A % \BeginAccSupp{method=hex,ActualText=00}^^A % #1\EndAccSupp{}}} % \def\theCodelineNo{\linenumberstyle{^^A % \arabic{CodelineNo}}} % \def\theFancyVerbLine{\linenumberstyle{^^A % \arabic{FancyVerbLine}}} % \fvset{fontsize=\small, frame=leftline, numbersep=2pt, numbers=left, framerule=0.4pt, framesep=4pt, rulecolor=\color[gray]{0.75}, gobble=4} % % \def\PrintDescribeMacro#1{^^A % \begingroup \MacroFont % \mparwidth{\string #1}^^A % \endgroup} % \let\PrintMacroName\PrintDescribeMacro % \newcommand*\mparwidth[1]{^^A アレ % \begingroup % \settowidth\@tempdima{#1}^^A % \@tempdimb\marginparwidth % \advance\@tempdimb-3\p@ % \ifdim\@tempdima>\@tempdimb % ^^A\fontfamily{lmtt}\fontseries{lc}\selectfont % \settowidth\@tempdima{#1}^^A % \ifdim\@tempdima>\@tempdimb % \advance\@tempdima10\p@ % \divide\@tempdima\p@ % \divide\@tempdimb\@tempdima % \expandafter\scalebox\expandafter{\romannumeral-`0\strip@pt\@tempdimb}[1.0]{#1}^^A % \else % #1^^A % \fi % \else % #1^^A % \fi\endgroup} % % \newcount\em@@count % \chardef\em@@unique=17 % \newif\ifem@@lastand \global\em@@lastandtrue % \def\endmacro{^^A % \ifdim\lastskip=-\em@@unique sp\relax^^A アレ % \else % \immediate\write\@auxout{^^A % \noexpand\em@@last{\the\em@@count}}^^A % \fi % \global\advance\em@@count\@ne % \endtrivlist % \expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\em@@savedname\expandafter\expandafter\expandafter{\expandafter\string\saved@macroname}^^A % \ifx\em@@list\@undefined % \global\expandafter\def\expandafter\em@@list\expandafter{\em@@savedname}^^A % \else % \ifem@@lastand % \expandafter\ltx@GlobalPrependToMacro\expandafter\em@@list\expandafter{\em@@savedname\em@@andlast}^^A % \else % \expandafter\ltx@GlobalPrependToMacro\expandafter\em@@list\expandafter{\em@@savedname\em@@and}^^A % \fi % \global\em@@lastandfalse % \fi % \expandafter\ifx\csname em@@last@\the\em@@count\endcsname\relax % \else % \em@@print % \global\let\em@@list\@undefined % \global\em@@lastandtrue % \fi % \vskip-\em@@unique sp\relax % } % \def\em@@and{{\normalfont\@@it\itshape \,, \,}} % \def\em@@andlast{{\normalfont\@@it\itshape \,,\, and \,}} % \def\em@@print{{^^A % \par\noindent % \small\@@it\itshape (End of definition for {\MacroFont\itshape\em@@list}\,.)\par}} % \AtEndDocument{^^A % \immediate\write\@auxout{^^A % \noexpand\em@@last{\the\em@@count}}} % % \definecolor{hred}{rgb}{0.5,0,0} % \definecolor{hblue}{rgb}{0,0,0.45} % \hypersetup{^^A % linkcolor=hred, % urlcolor=hblue, % pdfauthor=kkotsi, % } % % \GetFileInfo{outoruby.dtx} % \DeclareRobustCommand\file[1]{\textsf{#1}} % \DeclareRobustCommand\pkg[1]{\file{#1}} % \DeclareRobustCommand\cls[1]{\file{#1}} % % \newcommand\globstar{^^A % \texttt{\textit{\large\lower.5ex\hbox{*}}}} % % \newcommand\jkrubypkg{^^A % 画期的\ajSnowman なルビパッケージ} % \newcommand\ltjrubypkg{^^A % \href{https://github.com/luatexja/luatexja}{\pkg{luatexja-ruby}}} % \newcommand\pxrbpkg{^^A % \href{https://github.com/zr-tex8r/PXrubrica}{\pkg{pxrubrica}}} % % \newcommand\X{\(\mathbb{X}\)} % % \xspcode`\\=\thr@@ % \xspcode`\{=\@ne % \xspcode`\}=\tw@ % % \catcode`\<=\active % \newcommand\@@it{^^A % \fontfamily{ntxlf}\def\ntx@scaled{s*[1]}\selectfont} % \protected\def<#1>{{\eghostguarded{^^A % \@@it % \(\langle\)\null\textit{\met@#1_{}\@nil}\null\(\rangle\)}}} % \DeclareRobustCommand*\meta[1]{<#1>} % \def\met@#1_#2#3\@nil{^^A % \ltx@ifempty{#3}{#1}{^^A % \c@@arg #1$_{#2}$\met@#3\@nil}} % \let\@@outorb@opt@opt\outorb@opt@opt % \def\outorb@opt@opt#1\outorb@nil{^^A % \begingroup % \edef<{\string<}^^A % \protected@edef\x{#1}^^A % \expandafter\endgroup\expandafter\@@outorb@opt@opt\x\outorb@nil} % % \DeclareRobustCommand*\cs{^^A % \ltx@ifnextchar\bgroup{\cs@@{}}{\cs@@@{}}} % \def\cs@@#1#2{^^A % \eghostguarded{\texttt{\bslash #2}}#1} % \def\cs@@@#1#2{\cs@@{#1}{\expandafter\@gobble\string#2}} % \DeclareRobustCommand*\@cs{^^A % \ltx@ifnextchar\bgroup{\cs@@\c@@arg}{\cs@@@\c@@arg}} % % \DeclareRobustCommand\A{^^A % \ltx@ifnextchar[\oarg\marg} % \newcommand*\marg[1]{\eghostguarded{^^A % \texttt\{\c@@arg #1\texttt\}}} % \def\oarg[#1]{\eghostguarded{^^A % \texttt{[\c@@arg #1]}}} % \def\CS{\cs{CS}} % \def\CSa{\cs{CSa}} % \def\CSb{\cs{CSb}} % \def\pxrr@inter{\cs{pxrr@inter}\c@@arg} % \def\pxrr@pre{\cs{pxrr@pre}\c@@arg} % \def\pxrr@post{\cs{pxrr@post}\c@@arg} % \def\c@@arg{^^A % \ltx@ifnextchar\bgroup{\c@@@rg}{^^A % \ltx@ifnextchar[{\c@@@@rg}{}}} % \def\c@@@rg#1{^^A % \marg{#1}\c@@arg} % \def\c@@@@rg[#1]{^^A % \oarg[#1]\c@@arg} % % \newcommand\ttindent{\mbox{\texttt{\space\space}}} % \newcommand*\ttend[1]{\texttt\%\\^^A % \@@ttend{#1}} % \def\@@ttend#1{^^A % \ifnum#1>\z@ % \ttindent % \begingroup \@tempcnta=#1\relax \advance\@tempcnta\m@ne % \expandafter\endgroup\expandafter\@@ttend\expandafter{\the\@tempcnta}^^A % \fi\c@@arg} % % \newcommand*\desccs[1]{\par % \needspace{6\baselineskip}^^A % \noindent % \if*\noexpand#1^^A % \expandafter\DescribeMacro % \else % \DescribeMacro{#1}^^A % \cs#1^^A % \expandafter\c@@arg % \fi} % % \newcommand*\@@argbrace[1]{^^A % \@ifnextchar\bgroup{^^A % \@@argbrace@b{#1}}{#1}} % \def\@@argbrace@b#1#2{#1{{#2}}} % % \newcommand*\headitem[1]{^^A % \if@@movemarginpar \@@movemarginparfalse \fi % \par\noindent\hb@xt@\z@{\hss\mparwidth{#1}\hskip\labelsep}\ignorespaces} % \newcommand*\inarg[1]{^^A % \headitem{\texttt{\##1}:}\c@@arg} % \newcommand*\result{^^A % \@@argbrace\@@result} % \def\@@result#1{^^A % \headitem{\texttt{\cs#1} \textrightarrow}\c@@arg} % \newcommand*\intl[1]{^^A % \@@argbrace\@@intl} % \def\@@intl#1{^^A % \headitem{\texttt{\cs#1}:}\c@@arg} % % \newif\if@@movemarginpar % \newcommand\movempar{\par\@@movemarginpartrue\vskip-\baselineskip\leavevmode} % % \newcommand*\argn[1]{^^A % \texttt{\##1}} % % \title{\pkg{outoruby}パッケージ} % \let\@@@@@makefntext\@makefntext % \let\@@@@@makefnmark\@makefnmark % \let\thanks\footnote % \author{kkotsi^^A % \let\@makefntext\@@@@@makefntext % \def\@@fnmark{}^^A % \footnote{リポジトリは\url{https://codeberg.org/kkotsi/outoruby}。}}^^A % \date{\filedate} % \begin{savenotes} % \HyOrg@maketitle % \end{savenotes} % \begin{abstract} % \pxrbpkg をラップし、 % \outoruby{自動}{じ|どう}で\outoruby[||-][-|]{行頭形}{ぎょう|とう|けい}/ % \outoruby{行中形}{ぎょう|ちゅう|けい}/\outoruby[-||][|-]{行末形}{ぎょう|まつ|けい} % を\outoruby{切}{き}り\outoruby{替}{か}えられるるルビ\outoruby[-:]{命令}{めい|れい}\cs{outoruby}を % \outoruby[<>]{提供}{てい|きょう}する。 % \outoruby{実装}{じっ|そう}は\cs{discretionary}による。 % \end{abstract} % % \renewcommand*{\l@subsection}{\@dottedtocline{2}{1\zw}{2\zw}} % \renewcommand*{\l@subsubsection}{\@dottedtocline{3}{2\zw}{3\zw}} % \section*{\contentsname\@mkboth{\contentsname}{\contentsname}} % \begin{multicols}{2} % \@starttoc{toc} % \end{multicols} % % \section{背景} % % 従来、日本語\LaTeX 環境においてルビを実現するパッケージとしては % \begin{savenotes} % \begin{tasks}[ % label=\arabic*., % item-indent={2\zw}, % column-sep={1\zw}, ^^A 3x+(3-1)y=47の自然数解のうち最小のy \textwidth=47\zw % ](3) % \task \href{https://github.com/texjporg/jsclasses}{\pkg{okumacro}} % \task \href{http://xymtex.com/fujitas2/texlatex/index.html\#tategumi}{\pkg{furikana}}^^A % \footnote{長らくメンテナンスされておらず、改変再配布等も認められてない。\TeX\ Live未収録。} % \task \href{http://xymtex.com/fujitas2/texlatex/index.html\#tategumi}{\pkg{furiknkt}}^^A % \footnote{上に同じ。} % \task \href{https://www.nongnu.org/cjk/}{\pkg{ruby}(\pkg{CJK}パッケージ)\<}^^A % \footnote{日本語のルビとしては使うべきではないとされている。} % \task \pxrbpkg % \task \ltjrubypkg % \end{tasks} % 等が知られていた。 % これらのうち行分割可能なルビ命令を提供するのは\pxrbpkg と\ltjrubypkg のみであり、それぞれ次の制約がある: % \end{savenotes} % \begin{description} % \item[\pxrbpkg] \mbox{}\\* % モノルビに帰着できる場合にしか行分割できない。 % 行頭形/行中形/行末形を自動で切り替えられない。 % \item[\ltjrubypkg] \mbox{}\\* % \LuaLaTeX でしか使えない。 % \end{description} % % したがって、(u)\pLaTeX では行分割に応じて自動で形が変わるルビは実現できず、 % 一度組版してみた上で手動で調整しなければならなかった。 % % \texlevel % (u)\pLaTeX において自動切り替えルビを実現する以前の試みとしては、 % \pxrbpkg の作者である八登崇之氏(ZR氏)による検討がマクロツイーター % 「\href{https://zrbabbler.hatenablog.com/entry/20110724/1311503096}{ルビはじめました(PXrubrica パッケージ)(2)}」、 % またそこからリンクがある % \TeX\ Q \& A「\href{https://okumuralab.org/~okumura/texfaq/qa/55536.html}{Re: マクロでの行頭・行末判定方法}」 % に見られる。 % これらのページでは\cs{discretionary}および\pdfTeX の拡張機能(\epTeX にも実装済み)である\cs{pdfsavepos}について検討した上で、 % \cs{discretionary}は日本語ルビの行分割には力不足(!)だとしている。 % 拡張機能については\pxrbpkg にもこれらを使うことを見越した\cs{rubyuseextra}などのコードの痕跡があるが、\href{https://zrbabbler.hatenablog.com/entry/20120430/1335811160}{残念ながら実装されていない}。 % % \emph{しかしながら\cs{discretionary}によって日本語ルビを行分割させることは可能であり、本パッケージはそれを証明するために実装されている。} % % \section{使い方} % % 単に読み込む。オプションはない。 % % \begin{Verbatim} % \usepackage{outoruby} % \end{Verbatim} % % \pkg{outoruby}は\pxrbpkg がサポートする任意のエンジン/フォーマットをサポートする\footnote{^^A % \pxrbpkg は現在\LaTeX しかサポートしていない。また\pkg{outoruby}は相互参照の仕組みが使えることを前提としている。}。 % % また\pxrbpkg に加え\pkg{ltxcmds}、\pkg{infwarerr}に依存する。いずれも\TeX\ Live収録済み。 % % 本文書の記述は\pxrbpkg\ v1.3e (2023/03/01) に基づく。 % % \bigskip % % 簡単には次のように使う: % % \begin{Verbatim} % あれは\outoruby[<j|]{超超超超超弩級}{ちょう|ちょう|ちょう|ちょう|ちょう|ど|きゅう}雪だるま。 % \end{Verbatim} % \marginfig{^^A % あれは\outoruby[<j|]{超超超超超弩級}{ちょう|ちょう|ちょう|ちょう|ちょう|ど|きゅう}雪だるま。 % } % % \oarg[\string<j|]の意味は\pxrbpkg の\cs{jruby}と同じ。 % % \emph{正しい出力を得るには複数回の処理が必要}であることに注意。 % % \subsection{命令} % % \desccs\outoruby[<option_1>][<option_2>][<pre-space>][<post-space>]{<body>}{<ruby>} % % <option_1>、<option_2>、<body>、<ruby>は\pxrbpkg での\@cs\jruby[<option>]{<body>}{<ruby>}に対応する。 % <option>に対応するものが2つあるが、これはそれぞれ次のように使われる: % % \begin{center} % \begin{tabular}{lccc} % \toprule % ルビ形 & 前進入設定 & 後進入設定 & 他の設定 \\ \midrule % 行中形 & <option_1>の前進入設定 & <option_1>の後進入設定 & <option_1> \\ % 行頭形 & <option_{\emph{2}}>の前進入設定 & <option_1>の後進入設定 & <option_1> \\ % 行末形 & <option_1>の前進入設定 & <option_{\emph{2}}>の後進入設定 & <option_1> \\ % \bottomrule % \end{tabular} % \end{center} % % つまり、<option_2>の前進入設定、後進入設定以外は無視される。 % % <pre-space>はルビの前に置かれる行分割によって消える空白、 % <post-space>はルビの後に置かれる行分割によって消える空白である。 % 詳しくは\ref{sec:prepost}節を参照。 % % 別名は定義しない。必要であれば自分でプリアンブルで % \begin{Verbatim} % \newcommand\ruby{\outoruby} % \end{Verbatim} % のようにすること。 % % \desccs*\outorb@outoruby % \cs{outoruby}と等価。 % % \medskip % % \desccs\outorubysetup{<option_2>} % % \cs{outoruby}の<option_2>の既定値を設定する。 % 現在ではパッケージ読み込み時に\verb+||-||+が指定されるが、\emph{この初期値は今後の\pxrbpkg の更新により変更する可能性がある}。 % 初期値を変更する場合でも、初期設定で自動で形が切り替わる点は変更しない予定である。 % \ref{sec:noprot}節の注意も参照。 % % 自動で行頭形/行末形になるのはこの既定値のためであり、たとえば\verb+|-|+に変更すると、行分割したとしても自動で形が切り替わらなくなる\footnote{^^A % つまり先の表で「行頭形」としていたところは正しくは「行分割が発生した場合の、行分割後の行頭のルビの形」という意味である。「行中形」、「行末形」についても同じ。 % }。 % % この命令による設定は累積する。すなわち、\verb+\outorubysetup{-}+としても設定は\verb+||-||+のままである。 % 値を更新したければ\verb+\outorubysetup{<->}+のように明示的に値を指定する必要がある。 % なお、進入を許可する設定はルビが行分割位置で版面外へはみ出ることを意味するので、\verb+||-||+と\verb+|-|+以外の設定を行う機会はないだろう。 % % \LaTeX のグループ内で使った場合、設定はグループ外には反映されない。 % % \desccs*\outorb@outorubysetup % \cs{outorubysetup}と等価。 % % \medskip % % \desccs\outorubyhyphenbreakable[<i>] % % \ref{sec:hyphpen}説で再度説明するが、\cs{outoruby}はハイフネーション関係の設定の影響を受ける。 % もしもハイフネーションが一切発生しないよう設定した場合、\cs{outoruby}のルビ中での行分割も禁止される可能性がある\footnote{^^A % \vadjust{^^A % \hb@xt@\z@{\hskip-2\zw\smash{\dbend}\hss}}^^A % 設定方法による。\cs{hyphenpenalty}などの影響は受けるが\cs{lefthyphenmin}などの影響は受けない。要は\cs{discretionary}なので。}。 % \cs{outorubyhyphenbreakable}を実行することで、この設定が改善できるかもしれない。 % <i>は分割のしやすさで、\cs{nolinebreak}などと同じ指定である。 % すなわち、\texttt0や\texttt1など小さめの数字を指定すると\cs{outoruby}中での行分割が起きやすくなる。ただし、同時にハイフネーションも発生しやすくなるので注意されたい。 % 省略時は\texttt0が指定された扱いになる。 % \emph{実行時の挙動の詳細はまったく固まってない。} % % \desccs*\outorb@outorubyhyphenbreakable % \cs{outorubyhyphenbreakable}と等価。 % % \medskip % % \desccs\outorb@discretionary{\\\ttindent\texlevel % \A{<pre-break_1>}\A{<post-break_1>}\\\ttindent % \A{<pre-break_2>}\A{<post-break_2>}\\\ttindent % \texttt\vdots\\\ttindent % \A{<pre-break_n>}\A{<post-break_n>}\\ % }{<no-break>} % % \smallskip % % 気持ち的には次と等価: % % \noindent % \@cs\discretionary{<pre-break_1>}{<post-break_1>}{\ttend1 % \@cs\discretionary{<pre-break_2>}{<post-break_2>}{\ttend1 % \texttt\vdots\\\@@ttend2 % \@cs\discretionary{<pre-break_n>}{<post-break_n>}{<no-break>}\texttt\ldots}} % % \subsection{注意点} % % \paragraph{相互参照} % % \cs{outoruby}や\cs{outorb@discretionary}を使った場合で行分割が発生した場合、正しい出力を得るには % 複数回の\LaTeX の処理が必要になる場合がある。 % \marginfig{\def\outorb@aux@write#1{}\raggedleft\fboxsep5\p@\fbox{\parbox{2.5\zw}{\leavevmode % \outoruby{重複受精}{ちょう|ふく|じゅ|せい}}}}^^A % \marginpar{\vskip3pt}^^A % \marginfig{\@namedef{outorb@disc@break@\the\outorb@disc@count}{}^^A % \raggedleft\fboxsep5\p@\fbox{^^A % \outoruby{赤木}{あか|ぎ}ファイル}}^^A % 十分な回数\LaTeX を走らせてない場合は左の図上のように文字が重なったり、あるいは左の図下のようにルビおよび親文字が表示されなかったりする。 % この場合 ``Label(s) may have changed.'' の警告が出ているはずなので、警告が出なくなるまでタイプセットを繰り返せば % 正常な出力を得られる。 % % \pkg{outoruby}以外の要素による変更がない場合、\emph{\pkg{outoruby}の相互参照は必ず1回で収束する}(しなければバグである)。 % したがって\pkg{outoruby}以外に相互参照を用いてない場合、2回のタイプセットで期待される出力を得られるはずである。 % % また、\cs{outoruby}の引数は複数回実行されることにも注意。 % % \paragraph{実行時間} % % \cs{outoruby}は行分割を実現するため、「すべての可能なルビの組まれ方」を一度組版している。 % したがってその回数だけ\cs{jruby}命令が実行されることとなり、処理に時間がかかる。 % たとえば % \begin{Verbatim} % \outoruby{視覴}{し|がん} % \end{Verbatim} % では % \begin{tasks}[ % label=\arabic*., % item-indent={2\zw}, % column-sep={1\zw}, % ](2) % \task \@cs\jruby[-]{視覴}{し|がん} % \task \@cs\jruby[-||]{視覴}{し|がん} % \task \@cs\jruby[-||]{視}{し} % \task \@cs\jruby[||-]{覴}{がん} % \task \@cs\jruby[||-]{視覴}{し|がん} % \end{tasks} % の5回の\cs{jruby}が実行されることになる。 % % \paragraph{突出禁止}\label{sec:noprot} % % \leavevmode\marginfig{\raggedleft\fboxsep5\p@\fbox{^^A % \jruby[||-]{左}{さ}と\jruby[-||]{死}{し}}}^^A % \pxrbpkg の\cs{jruby}命令は % ルビの方が親文字より短いのに突出禁止が指定された場合、左のようになる。 % \begin{Verbatim} % \jruby[||-]{左}{さ}と\jruby[-||]{死}{し} % \end{Verbatim} % % 期待される出力はおそらく右のようなものだろう:{\hfill\fboxsep5\p@\raisebox{3\p@}[\z@]{\fbox{^^A % \pxpatchon % \jruby[||-]{左}{さ}と\jruby[-||]{死}{し}}}\hfill\hskip\z@} % % \cs{jruby}を直接用いる場合には、ルビが親文字より短い場合には突出禁止を指定しないよう注意すればよいだけだが、 % \cs{outoruby}は<option_2>の指定に基づいてルビと親文字の長さの差を考慮せずに、一律ですべての行分割が発生するルビに対し突出禁止を指定する。 % そのため、この挙動が問題になる。 % % これに関する\pxrbpkg の作者による言及が\X 上にある: % % \begin{fullwidth}\begin{small}\begin{tasks}[ % style=itemize, % item-indent={2\zw}, % column-sep={1\zw}, % ](2) % \task \url{https://x.com/zr_tex8r/status/1310112648441131010} % \task \url{https://x.com/zr_tex8r/status/1310115177279361024} % \task \url{https://x.com/zr_tex8r/status/1518785815039545344} % \task \url{https://x.com/zr_tex8r/status/1518811402034577408} % \task \url{https://x.com/zr_tex8r/status/1518812096053473280} % \task \url{https://x.com/zr_tex8r/status/1518871129598795777} % \task \url{https://x.com/zr_tex8r/status/1518872316377059328} % \end{tasks}\end{small}\end{fullwidth} % % まとめると % \begin{itemize} % \item 自動で行頭/行末を判定できないので、突出禁止は必要な場合にのみ手動で指定するという想定 % \item そのため、ルビが親文字より短い場合に突出が禁止されるのは想定外 % \item 突出禁止が突出しない場合に影響するのはおかしいが、修正すると影響が大きそうで困っている\footnote{^^A % \<「真に」突出を禁止するオプション\eghostguarded{\texttt{|\string<-}}と\eghostguarded{\texttt{->|}}を追加すればよいんじゃなかろうか。 % } % \end{itemize} % といったところである。 % % \pkg{outoruby}としては、この挙動は\pxrbpkg の問題であり、\pxrbpkg 側で対応されるべきものであるという立場である。 % したがって\emph{\pkg{outoruby}で特別な対応をしてこれに対処することはしない}。 % % \texlevel % 一応(\eTeX が使えれば)プリアンブルで次のようにすればルビの方が長い場合にのみ突出禁止が有効となる: % \begin{Verbatim} % \usepackage{etoolbox} % \makeatletter % \patchcmd\pxrr@compose@oneside@block@do{% % \pxrr@evenspace@int{#1}\pxrr@boxr % }{% % \pxrr@evenspace@int{\pxrr@locate@inner}\pxrr@boxr % }{}{Patch failed} % \makeatother % \end{Verbatim} % 突出禁止を拡張肩付きの代わりに使っていた場合には困るけど……。 % % \paragraph{連続した\cs{outoruby}}\label{sec:dblruby} % % \cs{outoruby}はルビ前後での行分割の発生を検知している。 % ここで、\cs{outoruby}が連続し、かつ改行がちょうどその間で発生した場合、 % 2つの\cs{outoruby}のうちどちらか片方しかその改行を検知できない。 % したがってもう片方のルビは行中形になる。 % % 対策は不可能ではないだろうが大変そうなのでやる気はしない。 % % \paragraph{段落はじめ} % % \cs{outoruby}を段落最初で用いた場合、ルビ中で行分割が発生することはないと仮定して\cs{outoruby}独自の処理を取りやめ、すべての処理を\pxrbpkg の\cs{jruby}に任せる。 % そのため、ルビ中で行分割が発生しなくなるか、あるいは分割したとしても自動で形が切り替わらない。 % % もしもすごく長いラベルを持つ箇条書きを利用しているなどの理由で段落最初であっても\cs{outoruby}の処理を使いたい場合、\cs{mbox}などで明示的に段落を開始させてから\cs{outoruby}を用いる必要がある。 % その場合、\cs{outoruby}は段落はじめであることを検知できないので、段落インデントへ進入させたくないのであれば、手動で前進入禁止\verb+|-+を指定しなければならない。 % % \subsubsection{\cs{discretionary}による制約} % % 本パッケージは\cs{discretionary}を利用している関係上、これに伴う制約を受ける。 % \emph{これらの制約は仕様であり、今後のアップデートで改善される見込みはない}。 % したがって、こういった制約なしに行分割可能なルビを実現する\jkrubypkg あるいは\ltjrubypkg (\LuaLaTeX を用いてる場合)を利用した方がよいだろう。 % 同様に、モノルビに帰着できる場合は\pxrbpkg の\cs{jruby}を直接利用した方がよい % \begin{footnote}\label{fn:pxrbghost}^^A % この場合ルビは突出しないはずなので和文ゴーストを使うことができる。 % 和文ゴーストが有効である場合、\cs{jruby}が実際には突出することがないとしても、進入ありを設定するとエラーになることに気をつけられたい。 % さらには段落はじめの\cs{outoruby}は自動的に\cs{jruby}に切り替わる。 % \cs{outoruby}の<option_1>の既定値を別に設定できるようにすべきな気もするが、とりあえず以下のようにすればよいだろう: % \begin{Verbatim}[vspace=0.25\baselineskip,gobble=6,xleftmargin=\leftskip,fontsize=\footnotesize] % \newcommand\ruby[3][]{{% % \rubysetup{|-|}\rubyusejghost % \jruby[#1]{#2}{#3}% % }} % \end{Verbatim} % この命令は脆弱になるので注意。 % \end{footnote}^^A % 。 % % \paragraph{段落おわり} % % \cs{outoruby}は\pxrbpkg の\cs{jruby}と異なり、段落末尾での使用に対し特別な対処はしていない。 % したがって、段落末尾では手動で後進入禁止\verb+-|+を指定しなければ親文字が版面端まで使い切った場合にルビが版面からはみ出る恐れがある。 % % なお、通常はルビの後に句点が続くと考えられるが、箇条書きやディスプレイなどで文末に句点がない場合においては十分発生し得ると想定している。 % % \paragraph{ルビの長さ} % % \cs{outoruby}および\cs{outorb@discretionary}はルビの前後も含め複数箇所で行分割することを想定していない。 % したがってルビ全体の長さは2箇所以上での行分割が不要なほど十分短くなければならない。 % % もしも1つのルビが複数箇所で分割した場合には、正しい出力にならないのでエラーが出る。 % 加えて次回タイプセット時に\verb+\begin{document}+のタイミングで警告が出る。 % % \iffalse % \vbox{\hsize\z@\leavevmode % \outoruby{{$\sin$}{$\cos$}{$\cos$}{$\sin$}}{好き|嫌い|嫌い|好き}} % \fi % % \paragraph{ゴースト} % % \cs{outoruby}は前後での行分割を検知するためにゴースト処理と共存できない。 % 脚注\ref{fn:pxrbghost}で述べたとおり、\pxrbpkg においてゴースト処理を用いるのが有用な場合があるので\cs{outoruby}実行時に和文ゴーストが有効であってもエラーは出ない。 % しかしながら、その場合でも\cs{outoruby}はゴースト処理されず、明示的な補助設定が必要となる場合があることに注意されたい。 % % \paragraph{ハイフネーションペナルティ}\label{sec:hyphpen} % % \texlevel % \cs{outoruby}は\cs{discretionary}により実装されており、\cs{discretionary}はハイフネーション関連のパラメタの設定の影響を受ける。 % たとえば % \begin{Verbatim} % \hyphenpenalty=10000\relax % \end{Verbatim} % によりハイフネーションを禁止した場合、\cs{outoruby}中およびその前後での行分割も禁止される。 % 同様に\cs{outoruby}による行分割が発生しやすくするために % \begin{Verbatim} % \hyphenpenalty=0\relax % % または % \outorubyhyphenbreakable % \end{Verbatim} % のようにした場合、ハイフネーションもそれだけ発生しやすくなる。 % % なお、\cs{outoruby}および\cs{outorb@discretionary}はたとえ<pre-break_n>を空にしたとしても、常に\cs{exhyphenpenalty}ではなく\cs{hyphenpenalty}の影響を受ける。 % % \texlevel % もしもハイフネーションを完全に禁止したいのであれば、\cs{discretionary}の処理に影響を及ぼさない別の方法(\cs{hyphenchar}や\cs{language})を用いれば\cs{outoruby}と共存できる。 % % \paragraph{前後の空白}\label{sec:prepost} % % ルビの前後での行分割を検知するため、この行分割は\cs{outoruby}の内部で発生する必要がある。 % そのため、\cs{outoruby}の外部の前後では行分割が禁止される。 % \begin{itemize} % \item \cs{outoruby}の前側にある空白やペナルティは削除された後、\cs{outoruby}の内部で考慮される。 % \item \cs{outoruby}の後ろ側にある空白は無視され、消滅する。 % \end{itemize} % なるべく\cs{outoruby}側で対処するようにしているが完璧ではないので、ユーザが\cs{outoruby}の前後で\cs{allowbreak}や\cs{hspace}等を使うことは推奨されない。 % % もしもこれに反した場合 % \begin{itemize} % \item 行頭形/行末形に正しく切り替わらない % \item 行分割した場合に、行分割前/後に余計な空白が残る % \end{itemize} % などが発生する可能性がある。 % % \begin{Verbatim} % 最後の皇帝であらせられます\outoruby{愛新覚羅}{あい|しん|か|くら}\hspace{1\zw}溥儀様 % \end{Verbatim} % % {\catcode`\<=12 \marginfig{\raggedleft % \fboxsep2\p@ % \hspace*{-1\zw}^^A % \mbox{\fbox{\parbox<t>{9\zw}{^^A % \baselineskip1.5\zw % 最後の皇帝であらせられます愛新覚羅\hspace{1\zw}溥儀様 % }}\hskip-\fboxrule % \fbox{\parbox<t>{9\zw}{^^A % \baselineskip1.5\zw % 最後の皇帝であらせられます\outoruby{愛新覚羅}{あい|しん|か|くら}\hspace{1\zw}溥儀様 % }}}^^A % }}\marginpar{\vskip7pt} % % もしも行分割によって消滅する空白が前後に必要である場合は\cs{outoruby}の<pre-space>、<post-space>で\cs{hspace}を用いればよい\footnote{^^A % その空白が和欧文間空白である場合は\pxrbpkg の補助設定\eghostguarded{\texttt:}が使える。 % }: % \begin{Verbatim} % 最後の皇帝であらせられます\outoruby[][][][\hspace{1\zw}]{愛新覚羅}{あい|しん|か|くら}溥儀様 % \end{Verbatim} % % {\catcode`\<=12 \marginfig{\raggedleft % \fboxsep2\p@ % \fbox{\parbox<t>{9\zw}{^^A % \baselineskip1.5\zw % 最後の皇帝であらせられます\outoruby[][][][\hspace{1\zw}]{愛新覚羅}{あい|しん|か|くら}溥儀様 % }}}} % % なお、この例で「\outoruby{溥儀}{ふ|ぎ}」にまでルビをふると、\cs{hspace}を<post-space>に移動したことで連続したルビになってまずい(\ref{sec:dblruby}節参照)。 % % \paragraph{柔軟さ} % % \cs{outoruby}の中ではグルーが伸縮しない。 % よって\pxrbpkg の設定による和欧文間空白や<pre-space>、<post-space>に入れられた空白は伸び縮みしなくなる。 % 加えて、ルビの間および前後での行分割の起きやすさは同じ段落のすべての\cs{outoruby}(およびハイフネーション)で一律であり、 % 個別に指定することはできない。 % % \paragraph[This can't happen (disc<n>).]{\textexlevel This can't happen (disc<n>).} % % 対策したから多分大丈夫……。(\href{https://okumuralab.org/tex/mod/forum/discuss.php?d=416}{関連}) % % \needspace{6\baselineskip} % \section{例} % % \begingroup \catcode`\<=12 % \begin{VerbatimOut}[commandchars=/()]{\jobname.tmp} % \rubysetup{<j>}\outorubysetup{||-||} % \outoruby{祇園精舎}{ぎ|おん|しょう|じゃ}の\jruby{鐘}{かね}の\jruby{声}{こえ}、 % \outoruby{諸行無常}{しょ|ぎょう|む|じょう}の\outoruby[-|]{響}{ひびき} % \jruby{有}{あ}り。\jruby{沙羅双樹}{しゃ|ら|そう|じゅ}の\jruby{花}{はな}の % \jruby{色}{いろ}、\outoruby{盛者必衰}{じょう|しゃ|ひっ|すい}の % \outoruby{理}{ことわり}を\outoruby[|-]{顕}{あらわ}す。\jruby{奢}{おご}れる % \jruby{者}{もの}も\jruby{久}{ひさ}しからず、\jruby{唯}{ただ}\jruby{春}{はる}の % \jruby{夜}{よ}の\jruby{夢}{ゆめ}の\jruby{如}{ごと}し。\jruby{猛}{たけ}き % \jruby{者}{もの}も\jruby{遂}{つい}には\jruby{滅}{ほろ}びぬ、 % \outoruby{偏}{ひとえ}に\jruby{風}{かぜ}の\jruby{前}{まえ}の\jruby{塵}{ちり}に % \jruby{同}{おな}じ。\jruby{遠}{とお}く\outoruby{異朝}{い|ちょう}を % \outoruby{訪}{とぶら}えば、\jruby{秦}{しん}の\outoruby{趙高}{ちょう|こう}、 % \jruby{漢}{かん}の\jruby{王莽}{おう|もう}、\outoruby[-|]{梁}{りょう}の % \outoruby{周伊}{しゅう|い}、\jruby{唐}{とう}の\jruby{禄山}{ろく|さん}、 % \jruby{是等}{これ|ら}は\jruby{皆}{みな} % \outoruby[|-|]{旧主先王}{きゅう|しゅ|せん|こう}の\outoruby{政}{まつりごと}にも % \outoruby{従}{したが}わず、\jruby{楽}{たの}しみを\jruby{極}{きわ}め、 % \outoruby{諫}{いさめ}をも\jruby{思}{おも}い\jruby{入}{い}れず、 % \jruby{天下}{てん|か}の\jruby{乱}{みだ}れん\jruby{事}{こと}をも\jruby{悟}{さと} % らずして、\jruby{民間}{みん|かん}の\jruby{愁}{うれ}うる\outoruby{所}{ところ}を % \jruby{知}{し}らざりしかば、\jruby{久}{ひさ}しからずして\jruby{亡}{ぼう}じし % \jruby{者}{もの}ども\jruby{也}{なり}。 % \end{VerbatimOut} % \newbox\@@box % \setbox\@@box=\vbox{^^A % \kanjiskip=\z@ plus 0.1\zw % \hsize11\zw % \vskip\topsep % \pxpatchon % {\catcode`\%=14 \input{\jobname.tmp}}^^A % \par % \hfill{\footnotesize (平家物語より)}} % \setbox\z@=\vbox{^^A % \hsize32\zw % \advance\hsize\marginparwidth % \advance\hsize-3\zw % \VerbatimInput[gobble=\z@,vspace=\z@]{\jobname.tmp}} % \loop % \@tempdima\pagegoal % \advance\@tempdima-\pagetotal % \ifdim\@tempdima<\baselineskip % \newpage % \else\ifdim\pagegoal=\maxdimen % {\baselineskip1sp\null}^^A % \nobreak % \else % \vskip-0.75\zw % \setbox\tw@=\vsplit\z@ to\@tempdima % \setbox4=\vsplit\@@box to\@tempdima % \setbox\tw@=\vtop{\unvbox\tw@}^^A % \setbox4=\vtop{\unvbox4}^^A % \hb@xt@\textwidth{^^A % \hskip-\marginparwidth\hskip4\zw\textcolor[gray]{0.75}{\vrule}\box4\textcolor[gray]{0.75}{\vrule}\kern-0.4\p@\hss\box\tw@}^^A % \fi\fi % \ifdim\dp\@@box>\z@ % \repeat % \unvbox\z@ % \endgroup % % \StopEventually % % \section[実装]{\texlevel 実装} % % \catcode`\#=\active % \let#\argn % % \subsection{初期化} % \subsubsection{宣言} % % \newcommand\@@sourcepart[1]{} % \newcommand\@@sourcepartend{\endinput} % \input{outoruby.dtx} % \begin{macrocode} %<*pkg> % \end{macrocode} % % オプションはない。 % % \begin{macro}{\outorb@pkgname} % \begin{macro}{\outorb@err} % \begin{macro}{\outorb@warn} % \begin{macro}{\outorb@warn@noln} % エラーや警告など。 % \begin{macrocode} \def\outorb@pkgname{outoruby} \def\outorb@err#1{% \@PackageError\outorb@pkgname{#1}\@ehc } \def\outorb@warn{% \@PackageWarning\outorb@pkgname } \def\outorb@warn@noln{% \@PackageWarningNoLine\outorb@pkgname } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \subsubsection{依存} % % ルビの処理は\pkg{pxrubrica}に丸投げする。 % % \begin{macrocode} \RequirePackage{pxrubrica}[2011/07/23] % \end{macrocode} % % \pxrbpkg の以下の内部命令を利用する: % \begin{tasks}[ % style=itemize, % item-indent=1\zw, % label-width=1\zw, % column-sep=\z@, % label-offset=0\zw, % ](4) % \task \cs{ifpxrr@safe@mode} % \task \cs\rubynousejghost % \task \cs{pxrr@po@TR@}\globstar % \task \cs{pxrr@po@C@}\globstar % \end{tasks} % \begin{tasks}[ % style=itemize, % item-indent=1\zw, % label-width=1\zw, % column-sep=\z@, % label-offset=0\zw, % ](4) % \task \cs\pxrr@cnta % \task \cs\pxrr@decompbar % \task \cs\pxrr@decompose % \task \cs\pxrr@if@last % \task \cs\pxrr@unite@group % \task \cs\pxrr@zip@list % \task \cs\pxrr@ifprimitive % \task \cs\pxrr@inhibitglue % \task \cs{ifpxrr@abody} % \task \cs\pxrr@check@kinsoku % \end{tasks} % % \begin{macro}{\ifpxrr@safe@mode} % \begin{macro}{\pxrr@unite@group} % \begin{macro}{\pxrr@ifprimitive} % \begin{macro}{\pxrr@inhibitglue} % \pxrbpkg のバージョンによっては定義されてない可能性がある命令の代替定義。 % \begin{macrocode} \expandafter\ifx\csname ifpxrr@safe@mode\endcsname\relax \expandafter\let\csname ifpxrr@safe@mode\expandafter\endcsname\csname iffalse\endcsname \fi \expandafter\ifx\csname pxrr@unite@group\endcsname\relax \def\pxrr@unite@group#1{% \def\pxrr@inter##1{% \ltx@LocalAppendToMacro#1{##1}% }% \def\pxrr@pre{% \let#1\ltx@empty \pxrr@inter }% \def\pxrr@post{% \expandafter\def\expandafter#1\expandafter{% \expandafter\pxrr@pre\expandafter{#1}\pxrr@post }% }% #1% } \fi \expandafter\ifx\csname pxrr@ifprimitive\endcsname\relax \def\pxrr@ifprimitive#1#2#3{#3} \fi \expandafter\ifx\csname pxrr@inhibitglue\endcsname\relax \let\pxrr@inhibitglue\relax \fi % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \pkg{ltxcmds}および\pkg{infwarerr}(なぜ?)を利用する。 % % \begin{macrocode} \RequirePackage{ltxcmds}[2011/08/22]% \ltx@LocalPrependToMacro \RequirePackage{infwarerr} % \end{macrocode} % % \subsubsection{フォーマット依存命令} % % \begin{macro}{\outorb@disc@count} % \cs{outorb@discretionary}で\cs{outorb@discretionary}ごとのユニークな識別子に用いる。 % \begin{macro}{\outorb@disc@box} % \cs{outorb@discretionary}で\meta{no-break}を保持するユニークなboxレジスタ。 % \begin{macrocode} \newcount\outorb@disc@count \newbox\outorb@disc@box % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\outorb@thepage} % \begin{macro}{\outorb@aux@write} % \begin{macro}{\outorb@aux@write@immediate} % \begin{macro}{\outorb@AtBeginDocument} % \begin{macro}{\outorb@AtEndDocument} % \begin{macro}{\outorb@labelchanged} % \begin{macro}{\outorb@aux@write@providecommand} % \begin{macro}{\outorb@errifdefined} % \begin{macro}{\outorb@MM} % \begin{macro}{\outorb@iM} % \par \pxrbpkg 、\pkg{ltxcmds}、\pkg{infwarerr}、\pkg{outoruby}以外で定義されている命令はここでラップする。 % \begin{macrocode} \def\outorb@thepage{\thepage} \def\outorb@aux@write#1{% \protected@write\@auxout{}{#1}% } \def\outorb@aux@write@immediate{% \immediate\write\@auxout } \def\outorb@AtBeginDocument{% \AtBeginDocument } \def\outorb@AtEndDocument{% \AtEndDocument } \def\outorb@labelchanged{% \@tempswatrue } \def\outorb@aux@write@providecommand#1{% \string\providecommand\string#1% } \def\outorb@errifdefined#1{% \newcommand#1{}% } \mathchardef\outorb@MM=20000 \mathchardef\outorb@iM=9999 % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \begin{macro}{\outorb@getpen} % \movempar % \inarg1 <n> % \begin{flushleft} % \begin{tabular}{ll} % \toprule % <n> & value \\ \midrule % 0 & \cs\z@ \\ % 1 & \cs\@lowpenalty \\ % 2 & \cs\@medpenalty \\ % 3 & \cs\@highpenalty \\ % else & \cs\@M \\ \bottomrule % \end{tabular} % \end{flushleft} % \begin{macrocode} \def\outorb@getpen{\@getpen} % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@protected} % \par \cs{protected}がある場合\verb+\protected\def+、なければ定義後に\cs{MakeRobust}相当の処理。 % \inarg1 \cs{def} % \inarg2 \CS % \begin{macrocode} \pxrr@ifprimitive\protected{% e-TeX \def\outorb@protected#1#2{% \protected#1#2% }% }{% non e-TeX \def\outorb@protected#1#2{% \def\outorb@protected@tempa{#2}% \afterassignment\outorb@protected@makerobust #1#2% }% % \end{macrocode} % \begin{macro}{\outorb@protected@makerobust} % \par \cs{MakeRobust}相当の処理。 % \LaTeX でしか正常に動かないので注意。 % Contorol symbolのことは考慮していない。 % \begin{macrocode} \def\outorb@protected@makerobust{% \begingroup \escapechar=\ltx@minusone \edef\outorb@tempa{% \def\noexpand\outorb@tempa{% \expandafter\string\outorb@protected@tempa }% }% \expandafter\endgroup\outorb@tempa \expandafter\let\csname \outorb@tempa\ltx@space\expandafter\endcsname \csname \outorb@tempa\endcsname \expandafter\edef\csname \outorb@tempa\expandafter\endcsname{% \noexpand\protect \expandafter\noexpand\csname \outorb@tempa\ltx@space\endcsname }% }% } % \end{macrocode} % \end{macro} % \end{macro} % % \subsection{擬似多重\cs{discretionary}} % % \begin{macro}{\outorb@discretionary} % \@cs{outorb@discretionary}\c@@arg{\ttend1{<pre-break_1>}{<post-break_1>}{<pre-break_2>}{<post-break_2>}\ldots}{<no-break>} % % \begin{Verbatim} % \discretionary{}{好き\kern-2\zw}{}% % \discretionary{嫌}{い\kern-2\zw}{}% % \discretionary{好き}{}{普通}% % \end{Verbatim} % というdiscretionaryの並びがあったとき、もしも「普通」が入る余裕が行内にあるのであればすべてのdiscretionaryで<no-break>が選択される。 % % もしも「普通」が入り切らないのであれば、どこかのdiscretionaryで分割が発生する。このとき最後のdiscretionaryでは<no-break>が選択されたとしても、その前のdiscretionaryで<post-break>に仕込んだ負のkernによってその幅は打ち消される。 % したがって<post-break>が行長より十分に短ければ改行は1箇所でしか発生しない。 % % % \begin{macrocode} \outorb@protected\def\outorb@discretionary#1#2{% \begingroup % \end{macrocode} % \par <no-break>の幅が必要なので取得。 % #1中でスクラッチレジスタを使ってるかもしれないのでユニークなレジスタ。 % \begin{macrocode} \setbox\outorb@disc@box=\hbox{#2}% \ltx@ifblank{#1}{% % \end{macrocode} % \inarg1 \<(空) % \par \cs\discretionary にしない。 % \begin{macrocode} \unhbox\outorb@disc@box \endgroup }{% % \end{macrocode} % \inarg1{<pre-break_1>}{<post-break_1>}\ldots\c@@arg{<pre-break_n>}{<post-break_n>} % \begin{macrocode} \expandafter\expandafter\expandafter\pxrr@decompose\expandafter\expandafter\expandafter{% \ltx@zapspace{#1}% }% % \end{macrocode} % \result\pxrr@res\pxrr@pre{{<pre-break_1>}}\pxrr@inter{{<post-break_1>}}\ldots\pxrr@inter{{<post-break_n>}}\pxrr@post % \par 最外に\verb+{}+が増える\cs{pxrr@decompose}の仕様はとりあえず気にしない。 % \par #2の空白は\cs{ltx@zapspace}で無視。 % \begin{macrocode} \let\pxrr@inter\outorb@disc@inter \let\pxrr@pre\pxrr@inter \let\pxrr@post\outorb@disc@post \pxrr@res }% } % \end{macrocode} % \begin{macro}{\outorb@disc@post} % \par \cs{outorb@discretionary}の終了処理。 % \begin{macrocode} \def\outorb@disc@post{% \global\advance\outorb@disc@count\ltx@one \endgroup } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@disc@inter} % \par\cs{discretionary}組み立て。 % \inarg1<pre-break_n> % \inarg2\pxrr@inter % \inarg3<post-break_n> % \begin{macrocode} \def\outorb@disc@inter#1#2#3{% \ifx\pxrr@inter#2\else % \end{macrocode} % \inarg2\pxrr@post % \begin{macrocode} \outorb@err{% Extra pre-break, or forgotten post-break in \string\outorb@discretionary }% \fi \pxrr@if@last{% \discretionary{% \outorb@disc@break@pre #1% }{% #3% }{% \outorb@disc@nobreak \outorb@disc@ifbreakTF{\kern\wd\outorb@disc@box}{\unhbox\outorb@disc@box}}% }{% \discretionary{% \outorb@disc@break@pre #1% }{% #3\outorb@disc@break@post }{}% }% } % \end{macrocode} % \end{macro} % \par Aux書き出し。 % Discretionaryにwhatsitを入れるにはhbox等で包む必要。 % % \begin{macro}{\outorb@disc@break@post} % \begin{macro}{\outorb@disc@break@record} % <post-break>の場合。 % \begin{macrocode} \def\outorb@disc@break@post{% \hbox{\outorb@aux@write{% % \end{macrocode} % \par 分割したことを記録。次回<no-break>を出力しない。 % \begin{macrocode} \string\outorb@disc@break@aux{\the\outorb@disc@count}{\outorb@thepage}{\the\inputlineno}% {\outorb@disccommand}% % \end{macrocode} % \par \cs{csname}トリックで分割を記録し、複数箇所での分割を検出。 % <post-break_n>と<pre-break_{n+1}>は複数回行分割しても必ず同じ行、つまり同じ\cs{shipout}中にある。 % 重複検出は<pre-break>で。 % \begin{macrocode} \noexpand\outorb@disc@break@record{\the\outorb@disc@count}% }}% % \end{macrocode} % \par <no-break>の負の幅のカーン。 % \begin{macrocode} \kern-\wd\outorb@disc@box } \def\outorb@disc@break@record#1{% \expandafter\ltx@gobble\csname outorb@disc@break@check@#1\endcsname } % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\outorb@disc@break@pre} % \begin{macro}{\outorb@disccommand} % \begin{macro}{\outorb@disc@break@check} % \par <pre-break>の場合。 % これがあるのでpre-breakは空にならず\cs{hyphenpenalty}。 % 複数箇所での分割を検出しエラーにする。 % \begin{macrocode} \def\outorb@disc@break@pre{% \hbox{\outorb@aux@write{% \noexpand\outorb@disc@break@check{\the\outorb@disc@count}{\the\inputlineno}% {\outorb@disccommand}% \expandafter\noexpand\csname outorb@disc@break@check@\the\outorb@disc@count\endcsname }}% } \def\outorb@disccommand{\noexpand\outorb@discretionary} \def\outorb@disc@break@check#1#2#3#4{% \ifx#4\relax \expandafter\outorb@disc@break@check@error\expandafter{% \romannumeral-`0\outorb@thepage}{#1}{#2}{#3}% \fi } % \end{macrocode} % \begin{macro}{\outorb@disc@break@check@error} % \par 完全展開可能なエラー。expl3の\cs{msg\_expandable\_error}あたりの実装を参考にした。 % \begin{macrocode} \def\outorb@tempa#1{% \def\outorb@disc@break@check@error##1##2##3##4{% \expandafter\expandafter\expandafter\ltx@carzero\ltx@firstofone{% #1##4at line ##3 break twice in p.##1. (##2)}% \@nil }% } \ltx@LocalExpandAfter\outorb@tempa\csname outoruby.sty Error:\endcsname % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \begin{macro}{\outorb@disc@nobreak} % \par <no-break>の場合。 % 確実に\cs{outorb@disc@break}より後なので % Label(s) may have changed.検出(分割していたのが分割しなくなった場合)用。 % \begin{macrocode} \def\outorb@disc@nobreak{% \hbox{\outorb@aux@write{% \string\outorb@disc@nobreak@aux{\the\outorb@disc@count}{\outorb@thepage}{\the\inputlineno}% {\outorb@disccommand}% }}% } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@disc@ifbreakTF} % \par 前回処理時に処理中の\cs{outorb@discretionary}分割したか。 % <no-break>を描画するか代わりに同じ幅のkernにするか。 % \begin{macrocode} \def\outorb@disc@ifbreakTF{% \expandafter\ifx\csname outorb@disc@break@\the\outorb@disc@count\endcsname\relax \expandafter\ltx@secondoftwo \else \expandafter\ltx@firstoftwo \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@disc@break@aux} % \par Auxに書き込まれる命令。 % \inarg1 Id(\cs{outorb@disc@count}由来) % \inarg2 \cs{outorb@discretionary}が使われた行番号 % \inarg3 \cs{outorb@discretionary}が実際に出力されたページ(\cs{outorb@thepage}由来) % \inarg4 警告に使うコマンド名(\cs{outorb@disccommand}由来) % \begin{macrocode} \def\outorb@disc@break@aux#1#2#3#4{% \expandafter\ifx\csname outorb@disc@break@#1\endcsname\relax \global\expandafter\def\csname outorb@disc@break@#1\endcsname{}% \else % \end{macrocode} % \par 以前のタイプセットで複数箇所で分割した場合警告。 % 何回も出るかもしれないけどまあいいや。 % \begin{macrocode} \begingroup \ltx@LocToksA{#4}% \outorb@warn@noln{% \the\ltx@LocToksA at page #2 line #3 broke twice at last typeset.\MessageBreak The result may be incorrect% }% \endgroup \fi } % \end{macrocode} % \begin{macro}{\outorb@disc@nobreak@aux} % これはLabel(s) may have changed.用なので\verb+\begin{document}+では出番なし。 % \begin{macrocode} \def\outorb@disc@nobreak@aux#1#2#3#4{% } % \end{macrocode} % \par \pkg{outoruby}の読み込みをやめた場合にエラーを出さない。 % \begin{macrocode} \outorb@AtBeginDocument{% \outorb@aux@write@immediate{% \outorb@aux@write@providecommand\outorb@disc@break@aux[4]{}% \outorb@aux@write@providecommand\outorb@disc@nobreak@aux[4]{}% }% } % \end{macrocode} % \par Label(s) may have changed. % \begin{macrocode} \outorb@AtEndDocument{% \def\outorb@disc@break@aux#1#2#3#4{% \expandafter\ifx\csname outorb@disc@break@#1\endcsname\relax % \end{macrocode} % \par 分割していなかったのが分割するようになった場合。 % \begin{macrocode} \outorb@labelchanged \fi \expandafter\def\csname outorb@disc@break@enddoc@#1\endcsname{}% }% \def\outorb@disc@nobreak@aux#1#2#3#4{% \expandafter\ifx\csname outorb@disc@break@#1\endcsname\relax\else% break last time \expandafter\ifx\csname outorb@disc@break@enddoc@#1\endcsname\relax% no break current time % \end{macrocode} % \par 分割していたのがしなくなった場合。 % \begin{macrocode} \outorb@labelchanged \fi \fi }% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsection{リスト処理} % % \pxrbpkg の\pxrr@pre 、\pxrr@inter 、\pxrr@post によるリストを利用。 % \pxrbpkg にならい、一般にグルーピングはしておらず\cs{pxrr@pre}などの定義を上書きするので注意。 % \pxrbpkg がグルーピングしてないのは多分処理効率のため。 % % \begin{macro}{\outorb@pxrr@reverse} % \movempar % \inarg1 \pxrr@pre{<X_1>}\pxrr@inter{<X_2>}\ldots\pxrr@inter{<X_n>}\pxrr@post % \result\outorb@res \pxrr@pre{<X_n>}\ldots\pxrr@inter{<X_2>}\pxrr@inter{<X_1>}\pxrr@post % \begin{macrocode} \def\outorb@pxrr@reverse@list#1{% \let\outorb@res\ltx@empty \def\pxrr@pre##1{% \ltx@LocalPrependToMacro\outorb@res{% {##1}\pxrr@post }% }% \def\pxrr@inter##1{% \ltx@LocalPrependToMacro\outorb@res{% {##1}\pxrr@inter }% }% \def\pxrr@post{% \ltx@LocalPrependToMacro\outorb@res{% \pxrr@pre }% }% #1% } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@pxrr@step@list} % \movempar % \inarg1 \pxrr@pre{<X_1>}\pxrr@inter{<X_2>}\ldots\pxrr@inter{<X_n>}\pxrr@post % \result\outorb@res % \pxrr@pre{\pxrr@post}\ttend1 % \pxrr@inter{\pxrr@pre{<X_1>}\pxrr@post}\ttend1 % \pxrr@inter{\pxrr@pre{<X_1>}\pxrr@inter{<X_2>}\pxrr@post}\ttend1 % \texttt\vdots\\\ttindent % \pxrr@inter{\pxrr@pre{<X_1>}\pxrr@inter{<X_2>}\ldots\pxrr@inter{<X_n>}\pxrr@post}\ttend1 % \pxrr@post % \begin{macrocode} \def\outorb@pxrr@step@list#1{% \def\outorb@res{\pxrr@pre{\pxrr@post}}% \def\pxrr@pre##1##2{% \ltx@LocalAppendToMacro\outorb@res{% \pxrr@inter{% \pxrr@pre{##1}\pxrr@post }% }% ##2{\pxrr@pre{##1}}% }% \def\pxrr@inter##1##2##3{% \ltx@LocalAppendToMacro\outorb@res{% \pxrr@inter{% ##1\pxrr@inter{##2}\pxrr@post }% }% ##3{##1\pxrr@inter{##2}}% }% \def\pxrr@post##1{% \ltx@LocalAppendToMacro\outorb@res{% \pxrr@post }% }% #1% } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@pxrr@rstep@list} % \movempar % \inarg1 \pxrr@pre{<X_1>}\pxrr@inter{<X_2>}\ldots\pxrr@inter{<X_n>}\pxrr@post % \result\outorb@res % \pxrr@pre{\pxrr@post}\ttend1 % \pxrr@inter{\pxrr@pre{<X_1>}\pxrr@post}\ttend1 % \pxrr@inter{\pxrr@pre{<X_2>}\pxrr@inter{<X_1>}\pxrr@post}\ttend1 % \texttt\vdots\\\ttindent % \pxrr@inter{\pxrr@pre{<X_n>}\ldots\pxrr@inter{<X_2>}\pxrr@inter{<X_1>}\pxrr@post}\ttend1 % \pxrr@post % \begin{macrocode} \def\outorb@pxrr@rstep@list#1{% \def\outorb@res{\pxrr@pre{\pxrr@post}}% \def\pxrr@pre##1##2{% \ltx@LocalAppendToMacro\outorb@res{% \pxrr@inter{% \pxrr@pre{##1}\pxrr@post }% }% ##2{\pxrr@inter{##1}\pxrr@post}% }% \def\pxrr@inter##1##2##3{% \ltx@LocalAppendToMacro\outorb@res{% \pxrr@inter{% \pxrr@pre{##2}##1% }% }% ##3{\pxrr@inter{##2}##1}% }% \def\pxrr@post##1{% \ltx@LocalAppendToMacro\outorb@res{% \pxrr@post }% }% #1% } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@pxrr@product@list} % \movempar % \inarg1 \pxrr@pre{<X_1>}\pxrr@inter{<X_2>}\ldots\pxrr@inter{<X_n>}\pxrr@post % \result\outorb@res % \pxrr@pre\\\@@ttend2 % \A{\pxrr@post}\ttend2 % \A{\pxrr@pre{<X_1>}\pxrr@inter{<X_2>}\ldots\pxrr@inter{<X_n>}\pxrr@post}\ttend1 % \pxrr@inter\\\@@ttend2 % \A{\pxrr@pre{<X_1>}\pxrr@post}\ttend2 % \A{\pxrr@pre{<X_2>}\ldots\pxrr@inter{<X_n>}\pxrr@post}\ttend1 % \vdots\\\ttindent % \pxrr@inter\\\@@ttend2 % \A{\pxrr@pre{<X_1>}\pxrr@inter{<X_2>}\ldots\pxrr@inter{<X_n>}\pxrr@post}\ttend2 % \A{\pxrr@post}\ttend1 % \pxrr@post % \begin{macrocode} \def\outorb@pxrr@product@list#1{% \outorb@pxrr@step@list{#1}% \let\outorb@pxrr@product@list@tempa\outorb@res \outorb@pxrr@reverse@list{#1}% \expandafter\outorb@pxrr@rstep@list\expandafter{\outorb@res}% \expandafter\outorb@pxrr@reverse@list\expandafter{\outorb@res}% \pxrr@zip@list\outorb@pxrr@product@list@tempa\outorb@res \let\outorb@res\pxrr@res } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@pxrr@join@list} % \movempar % \inarg1 <|> % \inarg2 \pxrr@pre{<X_1>}\pxrr@inter{<X_2>}\ldots\pxrr@inter{<X_n>}\pxrr@post % \result\outorb@res % <X_1><|><X_2><|>\ldots <|><X_n> % \begin{macrocode} \def\outorb@pxrr@join@list#1#2{% \let\outorb@res\ltx@empty \def\pxrr@inter##1{% \pxrr@if@last{% \ltx@LocalAppendToMacro\outorb@res{##1}% }{% \ltx@LocalAppendToMacro\outorb@res{##1#1}% }% }% \let\pxrr@pre\pxrr@inter \def\pxrr@post{\ltx@gobble\pxrr@post}% #2% } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@pxrr@pair@list} % \movempar % \inarg1 \pxrr@pre{<X_1>}{<Y_1>}\pxrr@inter{<X_2>}{<Y_2>}\ldots\pxrr@inter{<X_n>}{<Y_n>}\pxrr@post % \result\outorb@res % \pxrr@pre{{<X_1>}{<Y_1>}}\pxrr@inter{{<X_2>}{<Y_2>}}\ldots\pxrr@inter{{<X_n>}{<Y_n>}}\pxrr@post % \begin{macrocode} \def\outorb@pxrr@pair@list#1{% \let\outorb@res\ltx@empty \def\pxrr@pre##1##2{% \ltx@LocalAppendToMacro\outorb@res{% \pxrr@pre{{##1}{##2}}% }% }% \def\pxrr@inter##1##2{% \ltx@LocalAppendToMacro\outorb@res{% \pxrr@inter{{##1}{##2}}% }% }% \def\pxrr@post{% \ltx@LocalAppendToMacro\outorb@res{% \pxrr@post }% }% #1% } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@pxrr@ifemptyTF} % #1が\pxrr@post のみからなるか。 % \begin{macrocode} \def\outorb@pxrr@ifemptyTF#1{% \begingroup \def\outorb@tempa{#1}% \def\outorb@tempb{\pxrr@post}% \expandafter\endgroup\ifx\outorb@tempa\outorb@tempb \expandafter\ltx@firstoftwo \else \expandafter\ltx@secondoftwo \fi } % \end{macrocode} % \end{macro} % % \subsection{オプション解析} % % \begin{macro}{\outorb@ifstreqTF} % #1と#2が文字列として等しいか(完全展開して比較)。 % \begin{macrocode} \def\outorb@ifstreqTF#1#2{% \begingroup \edef\outorb@tempa{#1}% \edef\outorb@tempb{#2}% \expandafter\endgroup\ifx\outorb@tempa\outorb@tempb \expandafter\ltx@firstoftwo \else \expandafter\ltx@secondoftwo \fi } % \end{macrocode} % \end{macro} % % \subsubsection{\pxrbpkg のオプションパース} % % \begin{macro}{\outorb@opt@parse} % オプションを解析して分類。 % \inarg1 \cs{jruby}の<option>に相当するもの(\oarg[]なし)。 % \result\outorb@opt@parse@bintr 前進入設定 % \result\outorb@opt@parse@bsub 前補助設定 % \result\outorb@opt@parse@mode モード % \result\outorb@opt@parse@asub 後補助設定 % \result\outorb@opt@parse@aintr 後進入設定 % \par \pxrbpkg の有限オートマトンのパラメタを参照。 % \begin{flushleft} % \begin{tabular}{ll} % \toprule % \cs\outorb@po@FS & 現在の状態 \\ % \cs\pxrr@po@C@<文字> & 文字クラス \\ % \cs\pxrr@po@TR@<現在の状態>@<文字クラス> & 遷移先の状態 \\ % \bottomrule % \end{tabular} % \end{flushleft} % \begin{macrocode} \def\outorb@opt@parse#1{% \outorb@ifstreqTF{#1}{||}{% \def\outorb@opt@opt{|-|}% }{% \edef\outorb@opt@opt{#1}% }% \let\outorb@opt@parse@bintr\ltx@empty \let\outorb@opt@parse@bsub\ltx@empty \let\outorb@opt@parse@mode\ltx@empty \let\outorb@opt@parse@asub\ltx@empty \let\outorb@opt@parse@aintr\ltx@empty \def\outorb@po@FS{bi}% \expandafter\outorb@opt@parse@loop\outorb@opt@opt @\outorb@end } % \end{macrocode} % \begin{macro}{\outorb@opt@parse@loop} % 有限オートマトン。 % \begin{macrocode} \def\outorb@opt@parse@loop#1{% \if#1@% \expandafter\outorb@opt@parse@exit \fi \ltx@ifundefined{pxrr@po@C@#1}{% \outorb@err{% Unexpected letter `#1' found% }% }{% \expandafter\let\expandafter\outorb@po@FS\csname pxrr@po@TR@\outorb@po@FS @\csname pxrr@po@C@#1\endcsname\endcsname \ifx\outorb@po@FS\relax \outorb@err{% Unexpected letter `#1' found% }% \fi % \end{macrocode} % \begin{center} % \newcommand\otherwise{{\@@it\textit{otherwise}}} % \begin{minipage}{0.5\textwidth}\centering % \begin{tabular}{c>{\ttfamily}ll<{?}} % \multicolumn{3}{c}{文字クラス} \\ % \toprule % F & @ & finish \\ % V & | & vertical \\ % S & :.*! & sub \\ % B & \string<( & befone inter \\ % A & >) & after inter \\ % M & -mgjMJchHPSeEfF & mode \\ % \bottomrule % \end{tabular}^^A % \end{minipage}\nobreak % \begin{minipage}{0.5\textwidth}\centering % \begin{tabular}{cl<{?}l} % \multicolumn{3}{c}{状態} \\ % \toprule % bi & before inter & 初期値 \\ % bb & before, bar \\ % bs & before, sub \\ % mi & mode \\ % as & after, sub \\ % ai & after, inter \\ % ab & after, bar \\ % fi & finish \\ % \bottomrule % \end{tabular}\par\raggedright\medskip\footnotesize % 次の指定をどう解釈するかという意味である。 % bsなら次に来る指定は前補助かそれ以降のもの。 % \end{minipage}\\[\bigskipamount] % \begin{minipage}{0.5\textwidth}\centering % \begin{tabular}{clll} % \toprule % 文字クラス & 状態 & 遷移先 & 設定の種類 \\\midrule % V & bi, bb & bb, bs & 前進入 \\ % & \otherwise & ab, fi & 後進入 \\ % S & bi, bb, bs & bs & 前補助 \\ % & \otherwise & as & 後補助 \\ % B & bi, bb & bs & 前進入 \\ % A & & fi & 後進入 \\ % M & & mi & モード \\ % \bottomrule % \end{tabular}^^A % \end{minipage}\nobreak % \begin{minipage}{0.5\textwidth}\centering % \begin{tabular}{cll} % \toprule % 遷移先 & 文字クラス & 設定の種類 \\ \midrule % bi & & 前進入(存在せず) \\ % bb & & 前進入 \\ % bs & S & 前補助 \\ % & \otherwise & 前進入 \\ % mi & & モード \\ % as & & 後補助 \\ % ai & & 後補助(現存せず) \\ % ab & & 後進入 \\ % fi & & 後進入 \\ % \bottomrule % \end{tabular}^^A % \end{minipage}% % \end{center} % \result\outorb@po@FS <遷移先> % \par 遷移先から設定の種類を分類。 % \begin{macrocode} \outorb@ifstreqTF{\outorb@po@FS}{bi}{% \ltx@LocalAppendToMacro\outorb@opt@parse@bintr{#1}% }{\outorb@ifstreqTF{\outorb@po@FS}{bb}{% \ltx@LocalAppendToMacro\outorb@opt@parse@bintr{#1}% }{\outorb@ifstreqTF{\outorb@po@FS}{bs}{% \outorb@ifstreqTF{\csname pxrr@po@C@#1\endcsname}{S}{% \ltx@LocalAppendToMacro\outorb@opt@parse@bsub{#1}% }{% \ltx@LocalAppendToMacro\outorb@opt@parse@bintr{#1}% }% }{\outorb@ifstreqTF{\outorb@po@FS}{mi}{% \ltx@LocalAppendToMacro\outorb@opt@parse@mode{#1}% }{\outorb@ifstreqTF{\outorb@po@FS}{as}{% \ltx@LocalAppendToMacro\outorb@opt@parse@asub{#1}% }{\outorb@ifstreqTF{\outorb@po@FS}{ai}{% \ltx@LocalAppendToMacro\outorb@opt@parse@asub{#1}% }{\outorb@ifstreqTF{\outorb@po@FS}{ab}{% \ltx@LocalAppendToMacro\outorb@opt@parse@aintr{#1}% }{\outorb@ifstreqTF{\outorb@po@FS}{fi}{% \ltx@LocalAppendToMacro\outorb@opt@parse@aintr{#1}% }{% \outorb@err{% This can happen, may be a bug.\MessageBreak (\outorb@po@FS)\MessageBreak pxrubrica: \csname ver@pxrubrica.sty\endcsname,\MessageBreak outoruby: \ltx@space\csname ver@outoruby.sty\endcsname }% }}}}}}}}% }% \outorb@opt@parse@loop } % \end{macrocode} % \begin{macro}{\outorb@opt@parse@exit} % \begin{macrocode} \def\outorb@opt@parse@exit#1\outorb@end{% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsubsection{\cs{outorubysetup}} % % \begin{macro}{\outorb@setup@bintr} % <option_2>の前進入指定の既定値。 % \begin{macro}{\outorb@setup@aintf} % <option_2>の後進入指定の既定値。 % \begin{macro}{\outorubysetup} % \begin{macro}{\outorb@outorubysetup} % #1を\cs{outoruby}の<option_2>の既定値に。 % 前進入、後進入以外は無視し、それぞれ排他。 % \begin{macrocode} \let\outorb@setup@bintr\ltx@empty \let\outorb@setup@aintr\ltx@empty \outorb@errifdefined\outorubysetup \outorb@protected\def\outorubysetup#1{% \begingroup \outorb@opt@parse{#1}% \edef\outorb@tempa{% \ifx\outorb@opt@parse@bintr\ltx@empty\else \def\noexpand\outorb@setup@bintr{% \outorb@opt@parse@bintr }% \fi \ifx\outorb@opt@parse@aintr\ltx@empty\else \def\noexpand\outorb@setup@aintr{% \outorb@opt@parse@aintr }% \fi }% \expandafter\endgroup\outorb@tempa } \let\outorb@outorubysetup\outorubysetup \outorubysetup{||-||} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \subsubsection{\cs{outoruby}のオプション処理} % % \begin{macro}{\outorb@opt@prebreak} % 行末形の\cs{jruby}に渡すオプション(\A[]あり)。 % \begin{macro}{\outorb@opt@postbreak} % 行頭形の\cs{jruby}に渡すオプション(\A[]あり)。 % \begin{macro}{\outorb@opt@nobreak} % 行中形の\cs{jruby}に渡すオプション(\A[]あり)。 % \begin{macro}{\outorb@opt@pre} % <pre-space> % \begin{macro}{\outorb@opt@post} % <post-space> % \begin{macro}{\outorb@opt} % \leavevmode\par % \inarg1 \cs{outoruby}のオプション引数を全部まとめたもの(\A[]あり)。空もあり得る。 % \begin{macrocode} \def\outorb@opt#1{% \outorb@opt@opt#1[][][][]\outorb@nil } % \end{macrocode} % \begin{macro}{\outorb@err@mustempty} % 実際には不要。 % \begin{macrocode} \def\outorb@err@mustempty#1#2{% \ltx@ifblank{#1}{}{% \outorb@err{% Argument of \string#2 doesn't match its definition% }% }% }% % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@opt@opt} % \movempar % \inarg2 <option_1> % \inarg4 <option_2> % \inarg6 <pre-space> % \inarg8 <post-space> % \begin{macrocode} \def\outorb@opt@opt#1[#2]#3[#4]#5[#6]#7[#8]#9\outorb@nil{% \outorb@err@mustempty{#1}\outoruby \outorb@err@mustempty{#3}\outoruby \outorb@err@mustempty{#5}\outoruby \outorb@err@mustempty{#7}\outoruby \def\outorb@opt@pre{#6}% \def\outorb@opt@post{#8}% % \end{macrocode} % \par オプションパース。 % \begin{macrocode} \outorb@opt@parse{#4}% \ifx\outorb@opt@parse@bintr\ltx@empty \let\outorb@opt@break@bintr\outorb@setup@bintr \else \let\outorb@opt@break@bintr\outorb@opt@parse@bintr \fi \ifx\outorb@opt@parse@aintr\ltx@empty \let\outorb@opt@break@aintr\outorb@setup@aintr \else \let\outorb@opt@break@aintr\outorb@opt@parse@aintr \fi \outorb@opt@parse{#2}% \ifx\outorb@opt@parse@mode\ltx@empty % \end{macrocode} % \par \verb+||+は\verb+|-|+と扱われてしまう。 % \begin{macrocode} \def\outorb@opt@parse@mode{-}% \fi \edef\outorb@opt@nobreak{[#2]}% \edef\outorb@opt@prebreak{[% \outorb@opt@parse@bintr \outorb@opt@parse@bsub \outorb@opt@parse@mode \outorb@opt@break@aintr ]}% \edef\outorb@opt@postbreak{[% \outorb@opt@break@bintr \outorb@opt@parse@mode \outorb@opt@parse@asub \outorb@opt@parse@aintr ]}% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \begin{macro}{\outorb@opt@ifnobreakTF} % 補助設定から行分割の可否を把握。 % \inarg1 補助設定。 % \begin{macrocode} \def\outorb@opt@ifnobreakTF#1{% \edef\outorb@tempa{#1}% \expandafter\outorb@opt@ifnobreak#1*\outorb@nil } \def\outorb@opt@ifnobreak#1*#2\outorb@nil{% \ltx@ifblank{#2}{% \ltx@secondoftwo }{% \ltx@firstoftwo }% } % \end{macrocode} % \end{macro} % % \subsection{本体} % % \begin{macro}{\outoruby} % \begin{macro}{\outorb@outoruby} % \@cs{outoruby}[<option_1>][<option_2>][<pre-space>][<post-space>]{<body>}{<ruby>} \\ % <body>: <body_1><body_2>\ldots <body_n> \\ % <ruby>: <ruby_1>\texttt|<ruby_2>\texttt|\ldots \texttt|<ruby_n> % \begin{macrocode} \outorb@errifdefined\outoruby \outorb@protected\def\outoruby{% \outorb@outorb@opt{}[]% } \let\outorb@outoruby\outoruby % \end{macrocode} % \begin{macro}{\outorb@outorb@opt} % オプションを全部取得して\cs{outorb@outorb@checkv}へ(\A[]つき)。 % \begin{macrocode} \def\outorb@outorb@opt#1[#2]{% \ltx@ifnextchar[{% \outorb@outorb@opt{#1[{#2}]}% }{% \expandafter\outorb@outorb@checkv\expandafter{\ltx@gobblethree #1[{#2}]}% }% } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@outorb@checkv} % 段落はじめ(垂直モード)なら途中で分割しないと信じる。 % 段落はじめと\pxrbpkg に知らせるため特に何もせず処理丸投げ。 % \begin{macrocode} \def\outorb@outorb@checkv#1{% \ifvmode \begingroup \outorb@opt{#1}% \expandafter\outorb@outorb@vmode% \endgroup \else \outorb@prologue% \begingroup \outorb@opt{#1}% \expandafter\outorb@outorb% \endgroup (\outorb@epilogue) \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@outorb} % \begin{macro}{\outorb@outorb@check@kinsoku} % \pxrbpkg の禁則用の先読み処理をdiscretionaryに入れる前に代わりにやっておく。 % \begin{macrocode} \def\outorb@outorb#1#2{% \def\outorb@outorb@tempa{% \outorb@outorb@main{#1}{#2}% }% \ifpxrr@safe@mode % \end{macrocode} % \par 安全モード。 % \begin{macrocode} \expandafter\outorb@outorb@tempa \else \expandafter\outorb@outorb@check@kinsoku\expandafter\outorb@outorb@tempa \fi } \def\outorb@outorb@check@kinsoku#1{% \pxrr@abodyfalse \pxrr@check@kinsoku#1% } % \end{macrocode} % \end{macro} % \end{macro} % % \subsubsection{メインの処理} % % \begin{macro}{\outorb@outorb@main} % \movempar % \inarg1 <body> % \inarg2 <ruby> % \par オプションは\cs{outorb@opt}で処理済み。 % \begin{macrocode} \def\outorb@outorb@main#1#2{% % \end{macrocode} % \par 後禁則。 % \begin{macrocode} \edef\outorb@after@penalty{\the\pxrr@cntr}% \ifnum\outorb@after@penalty>\outorb@iM \outorb@outorb@anobrtrue \else % \end{macrocode} % \par オプションの後補助指定による後改行禁止。 % \begin{macrocode} \outorb@opt@ifnobreakTF\outorb@opt@parse@asub{% \outorb@outorb@anobrtrue }{% \outorb@outorb@anobrfalse }% \fi \ifnum\outorb@before@penalty>\outorb@iM \outorb@outorb@bnobrtrue \else \outorb@opt@ifnobreakTF\outorb@opt@parse@bsub{% \outorb@outorb@bnobrtrue }{% \outorb@outorb@bnobrfalse }% \fi % \end{macrocode} % \par 前後に入れるグルー。 % 補助設定によるものはここではなくdiscretionaryの中身で入れられる(伸縮はしなくなる)。 % \begin{macrocode} \ltx@LocalAppendToMacro\outorb@outorb@pre{% \hskip\outorb@before@glue\relax }% \expandafter\ltx@LocalAppendToMacro\expandafter\outorb@outorb@pre\expandafter{% \outorb@opt@pre }% \expandafter\ltx@LocalAppendToMacro\expandafter\outorb@outorb@post\expandafter{% \outorb@opt@post }% % \end{macrocode} % \par 引数処理。 % \begin{macrocode} \pxrr@decompbar{#1}% \let\outorb@body@list\pxrr@res \edef\outorb@body@count{\the\pxrr@cntr}% \pxrr@decompbar{#2}% \let\outorb@ruby@list\pxrr@res \edef\outorb@ruby@count{\the\pxrr@cntr}% \ifpxrr@safe@mode % \end{macrocode} % \par 安全モード。 % \begin{macrocode} \pxrr@unite@group\outorb@body@list \def\outorb@body@count{1}% \pxrr@unite@group\outorb@ruby@list \def\outorb@ruby@count{1}% \fi \ifnum\outorb@body@count>\ltx@one % \end{macrocode} % \par 可動グループルビ。 % \pxrbpkg 未実装だがひとまず熟語ルビと同じ扱いにする。 % \begin{macrocode} \ifnum\outorb@body@count=\outorb@ruby@count\relax \outorb@outorb@mj{#1}{#2}% \else \outorb@err{% \string\outoruby\ltx@space group count mismatch (\outorb@body@count <> \outorb@ruby@count)% }% \fi \else % \end{macrocode} % \par <body>が\verb+|+で区切られていない場合。 % グループ単位に分割。 % \begin{macrocode} \ifpxrr@safe@mode\else \pxrr@decompose{#1}% \ifnum\outorb@ruby@count=\pxrr@cntr % \end{macrocode} % \par 真になるのはモノルビか熟語ルビ、偽になるのはグループルビの場合。 % \begin{macrocode} \let\outorb@body@list\pxrr@res \edef\outorb@body@count{\the\pxrr@cntr}% \fi \fi \ifnum\outorb@body@count=\ltx@one % \end{macrocode} % \par グループルビとみなせる場合。1文字のモノルビ、熟語ルビを含むが処理は同じ。 % この場合<ruby>も単一グループからなっているので、結局モノルビと同じ処理が使える。 % \begin{macrocode} \outorb@outorb@mj{#1}{#2}% \else\ifnum\outorb@body@count=\outorb@ruby@count\relax % \end{macrocode} % \par モノルビ、熟語ルビ。 % \begin{macrocode} \outorb@outorb@mj{#1}{#2}% \else \outorb@err{% \string\outoruby\ltx@space group count mismatch (\outorb@body@count <> \outorb@ruby@count)% }% \fi\fi \fi \outorb@epilogue } % \end{macrocode} % \end{macro} % % \subsubsection{\cs{discretionary}組み立て} % % \begin{macro}{\outorb@outorb@mj} % \cs{outorb@discretionary}の引数を実際に組み立てる。 % \intl\outorb@boyd@list \pxrr@pre{<body_1>}\pxrr@inter{<body_2>}\ldots\pxrr@inter{<body_n>}\pxrr@post % \intl\outorb@boyd@list \pxrr@pre{<ruby_1>}\pxrr@inter{<ruby_2>}\ldots\pxrr@inter{<ruby_n>}\pxrr@post % \par 引数は<no-break>用。\cs{pxrr@post}で使われる。 % \inarg1 <body> % \inarg2 <ruby> % \begin{macrocode} \def\outorb@outorb@mj{% \expandafter\outorb@pxrr@product@list\expandafter{\outorb@body@list}% \expandafter\outorb@pxrr@pair@list\expandafter{\outorb@res}% \let\outorb@body@product@list\outorb@res \expandafter\outorb@pxrr@product@list\expandafter{\outorb@ruby@list}% \expandafter\outorb@pxrr@pair@list\expandafter{\outorb@res}% \let\outorb@ruby@product@list\outorb@res \pxrr@zip@list\outorb@body@product@list\outorb@ruby@product@list % \end{macrocode} % \result\pxrr@res % \pxrr@pre{\ttend2 % {\pxrr@post}\ttend2 % {\pxrr@pre{<body_1>}\pxrr@inter{<body_2>}\ldots\pxrr@inter{<body_n>}\pxrr@post}\ttend1 % }{\ttend2 % {\pxrr@post}\ttend2 % {\pxrr@pre{<ruby_1>}\pxrr@inter{<ruby_2>}\ldots\pxrr@inter{<ruby_n>}\pxrr@post}\ttend1 % }\pxrr@inter{\ttend2 % {\pxrr@pre{<body_1>}\pxrr@post}\ttend2 % {\pxrr@pre{<body_2>}\pxrr@inter{<body_3>}\ldots\pxrr@inter{<body_n>}\pxrr@post}\ttend1 % }{\ttend2 % {\pxrr@pre{<ruby_1>}\pxrr@post}\ttend2 % {\pxrr@pre{<ruby_2>}\pxrr@inter{<ruby_3>}\ldots\pxrr@inter{<ruby_n>}\pxrr@post}\ttend1 % }\ttend1 % \vdots\\\ttindent % \pxrr@inter{\ttend2 % {\pxrr@pre{<body_1>}\pxrr@inter{<body_2>}\ldots\pxrr@inter{<body_n>}\pxrr@post}\ttend2 % {\pxrr@post}\ttend1 % }{\ttend2 % {\pxrr@pre{<ruby_1>}\pxrr@inter{<ruby_2>}\ldots\pxrr@inter{<ruby_n>}\pxrr@post}\ttend2 % {\pxrr@post}\ttend1 % }\pxrr@post % \begin{macrocode} \let\pxrr@pre\outorb@outorb@mj@pre \let\pxrr@inter\outorb@outorb@mj@inter \let\pxrr@post\outorb@outorb@mj@post % \end{macrocode} % \result\outorb@outorb@disc@list % \cs{outorb@discretionary}の第一引数。 % \begin{macrocode} \let\outorb@outorb@disc@list\ltx@empty \pxrr@res } % \end{macrocode} % \begin{macro}{\ifoutorb@outorb@bnobr} % \begin{macro}{\ifouotrb@outorb@anobr} % 前後での分割禁止の有無。 % \begin{macrocode} \ltx@newif\ifoutorb@outorb@bnobr% before no break \ltx@newif\ifoutorb@outorb@anobr% after no break % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\outorb@outorb@mj@pre} % \begin{macrocode} \def\outorb@outorb@mj@pre#1#2{% \ifoutorb@outorb@bnobr % \end{macrocode} % \par 前分割禁止。 % ここで分割可能なパターンを入れない。 % \begin{macrocode} \else \outorb@outorb@mj@makeruby#1#2% \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@outorb@mj@inter} % \begin{macrocode} \def\outorb@outorb@mj@inter#1#2{% \pxrr@if@last{% \ifoutorb@outorb@anobr % \end{macrocode} % \par 後分割禁止。 % \begin{macrocode} \else \outorb@outorb@mj@makeruby#1#2% \fi }{% \outorb@outorb@mj@makeruby#1#2% }% } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@outorb@mj@makeruby} % 1つの<pre-break_m>と<post-break_m>のパターンを作る。 % \cs{ifoutorb@bnobr}の場合$m=k$、そうでなければ$m=k+1$。 % \inarg1 \pxrr@pre{<body_1>}\pxrr@inter{<body_2>}\ldots \pxrr@inter{<body_k>}\pxrr@post % \inarg2 \pxrr@pre{<body_{k+1}>}\pxrr@inter{<body_{k+2}>}\ldots \pxrr@inter{<body_n>}\pxrr@post % \inarg3 \pxrr@pre{<ruby_1>}\pxrr@inter{<ruby_2>}\ldots \pxrr@inter{<ruby_k>}\pxrr@post % \inarg4 \pxrr@pre{<ruby_{k+1}>}\pxrr@inter{<ruby_{k+2}>}\ldots \pxrr@inter{<ruby_n>}\pxrr@post % \par #1と#3から<pre-break_m>、#2と#4から<post-break_m>。 % \begin{macrocode} \def\outorb@outorb@mj@makeruby#1#2#3#4{% % \end{macrocode} % \par \cs{pxrr@inter}リストの処理で意味変えられるので退避しておいて後で戻す。 % \begin{macrocode} \let\outorb@outorb@mj@makeruby@pre\pxrr@pre \let\outorb@outorb@mj@makeruby@inter\pxrr@inter \let\outorb@outorb@mj@makeruby@post\pxrr@post % \end{macrocode} % \par 空(単一\pxrr@post )の場合、\cs\jruby 実行せず<pre-break_m>または<post-break_m>も空。 % ちょうどルビ全体のの前後で改行した場合。 % \result\outorb@outorb@mj@makeruby@pre@list <pre-break_m> % \begin{macrocode} \outorb@pxrr@ifemptyTF{#1}{% \def\outorb@outorb@mj@makeruby@pre@list{}% }{% \edef\outorb@outorb@mj@makeruby@pre@list{% \outorb@outorb@cmd@prebreak }% \outorb@pxrr@join@list{}{#1}% \expandafter\ltx@LocalAppendToMacro \expandafter\outorb@outorb@mj@makeruby@pre@list \expandafter{% \expandafter{\outorb@res}% }% \outorb@pxrr@join@list{|}{#3}% \expandafter\ltx@LocalAppendToMacro \expandafter\outorb@outorb@mj@makeruby@pre@list \expandafter{% \expandafter{\outorb@res}% }% }% \outorb@pxrr@ifemptyTF{#2}{% \def\outorb@outorb@mj@makeruby@post@list{}% }{% % \end{macrocode} % \result\outorb@outorb@mj@makeruby@post@list <post-break_m> % \begin{macrocode} \edef\outorb@outorb@mj@makeruby@post@list{% \outorb@outorb@cmd@postbreak }% \outorb@pxrr@join@list{}{#2}% \expandafter\ltx@LocalAppendToMacro \expandafter\outorb@outorb@mj@makeruby@post@list \expandafter{% \expandafter{\outorb@res}% }% \outorb@pxrr@join@list{|}{#4}% \expandafter\ltx@LocalAppendToMacro \expandafter\outorb@outorb@mj@makeruby@post@list \expandafter{% \expandafter{\outorb@res}% }% }% % \end{macrocode} % \par 追加。 % \begin{macrocode} \expandafter\ltx@LocalAppendToMacro\expandafter\outorb@outorb@disc@list\expandafter{% \expandafter{\outorb@outorb@mj@makeruby@pre@list}% }% \expandafter\ltx@LocalAppendToMacro\expandafter\outorb@outorb@disc@list\expandafter{% \expandafter{\outorb@outorb@mj@makeruby@post@list}% }% % \end{macrocode} % \par 退避していたのを戻す。 % \begin{macrocode} \let\pxrr@pre\outorb@outorb@mj@makeruby@pre \let\pxrr@inter\outorb@outorb@mj@makeruby@inter \let\pxrr@post\outorb@outorb@mj@makeruby@post } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@outorb@mj@post} % <no-break>を作り、\cs{outorb@discretionary}実行。 % \inarg1 <body> % \inarg2 <ruby> % \begin{macrocode} \def\outorb@outorb@mj@post#1#2{% \def\outorb@res{% \outorb@discretionary }% \expandafter\ltx@LocalAppendToMacro\expandafter\outorb@res\expandafter{% \expandafter{\outorb@outorb@disc@list}% }% \edef\outorb@outorb@mj@makeruby@nobreak{% \outorb@outorb@cmd@nobreak }% \ltx@LocalAppendToMacro\outorb@outorb@mj@makeruby@nobreak{% {#1}{#2}% }% \expandafter\ltx@LocalAppendToMacro\expandafter\outorb@res\expandafter{% \expandafter{\outorb@outorb@mj@makeruby@nobreak}% }% % \end{macrocode} % \par \cs{outorb@discretionary}実行。 % \begin{macrocode} \def\outorb@disccommand{\noexpand\outoruby}% \outorb@res } % \end{macrocode} % % \subsubsection{実際にルビを組み立てるコマンド} % % \begin{macro}{\outorb@outorb@cmd} % \begin{macro}{\outorb@outorb@cmd@prebreak} % \begin{macro}{\outorb@outorb@cmd@postbreak} % \begin{macro}{\outorb@outorb@cmd@nobreak} % \cs{edef}中で呼ばれる。 % \par\noindent\texttt{#1}: <body>(行分割位置に応じて調整済み) % \par\noindent\texttt{#2}: <ruby>(行分割位置に応じて調整済み) % \par これを使って実際にルビを組む。 % \begin{macrocode} \def\outorb@outorb@cmd{\noexpand\outorb@outorb@cmd@jruby} \def\outorb@outorb@cmd@prebreak{% \outorb@outorb@cmd \noexpand\outorb@outorb@pre {}% \outorb@opt@prebreak } \def\outorb@outorb@cmd@postbreak{% \outorb@outorb@cmd {}% \noexpand\outorb@outorb@post \outorb@opt@postbreak } \def\outorb@outorb@cmd@nobreak{% \outorb@outorb@cmd \noexpand\outorb@outorb@pre \noexpand\outorb@outorb@post \outorb@opt@nobreak } % \end{macrocode} % \begin{macro}{\outorb@outorb@cmd@jruby} % This can't happen対策で\cs{hbox}に入れる。 % \begin{macrocode} \def\outorb@outorb@cmd@jruby#1#2[#3]#4#5{% \hbox{% #1% \outorb@cmd@jruby[#3]{#4}{#5}% #2% }% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \subsubsection{垂直モード} % % \begin{macro}{\outorb@outorb@cmd@vmode} % 垂直モードだった場合の実際のルビの組み立て。 % \begin{macrocode} \def\outorb@outorb@cmd@vmode{% \noexpand\outorb@cmd@jruby\outorb@opt@nobreak } % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@cmd@jruby} % ルビを組む処理を投げる命令 % \begin{macrocode} \def\outorb@cmd@jruby{\jruby} % \end{macrocode} % \end{macro} % \begin{macro}{\outorb@outorb@vmode} % 垂直モードの場合。 % \begin{macrocode} \def\outorb@outorb@vmode{% \ltx@LocToksA\expandafter{\outorb@opt@pre}% \ltx@LocToksB\expandafter{\outorb@opt@post}% \edef\outorb@tempa##1##2{% \the\ltx@LocToksA \outorb@outorb@cmd@vmode{##1}{##2}% \the\ltx@LocToksB }% \expandafter\endgroup\outorb@tempa } % \end{macrocode} % \end{macro} % % \subsubsection{プロローグ} % % \begin{macro}{\outorb@prologue} % 垂直モードでない場合最初に実行される。 % 前側の空白を退避して<pre-space>に持っていく。 % ペナルティも退避して行分割の可否を判断した上、ここでの分割を禁止する。 % \begin{macrocode} \def\outorb@prologue{% \begingroup \rubynousejghost \outorb@hyphen@check % \end{macrocode} % \begin{macro}{\outorb@outorb@pre} % \begin{macro}{\outorb@outorb@post} % 前後のグルー(伸縮はしない)などを入れておく用。 % \begin{macrocode} \let\outorb@outorb@pre\ltx@empty \let\outorb@outorb@post\ltx@empty \outorb@bgluepen % \end{macrocode} % \par \cs\outorb@discretionary で改行するため、ここで改行してはいけない。 % \begin{macrocode} \penalty\outorb@MM % \end{macrocode} % \par This can't happen対策。 % \begin{macrocode} \hbox{}\penalty\outorb@MM } % \end{macrocode} % \begin{macro}{\outorb@bgluepen} % グルーとペナルティを退避。 % \result\outorb@before@glue 前側のグルー合計。 % \result\outorb@before@penalty 前側のペナルティ合計。 % \begin{macrocode} \def\outorb@bgluepen{% % \end{macrocode} % \result\ltx@LocSkipA グルー(処理途中)。 % \begin{macrocode} \ltx@LocSkipA0pt\relax % \end{macrocode} % \result\ltx@LocSkipA ペナルティ(処理途中)。 % \begin{macrocode} \pxrr@cnta=\ltx@zero \outorb@bgluepen@do \edef\outorb@before@glue{\the\ltx@LocSkipA}% \edef\outorb@before@penalty{\the\pxrr@cnta}% } % \end{macrocode} % グルーとペナルティがある間それを退避して削除する。 % \begin{macrocode} \pxrr@ifprimitive\lastnodetype{% e-TeX \def\outorb@bgluepen@do{% % \end{macrocode} % \begin{flushleft} % \begin{tabular}{lll} % \multicolumn{3}{c}{lastnodetype} \\ % \toprule % 11 & glue \\ % 12 & kern & 対処しない \\ % 13 & penalty \\ % \bottomrule % \end{tabular} % \end{flushleft} % \begin{macrocode} \ifnum\lastnodetype=11 \advance\ltx@LocSkipA\lastskip \unskip \expandafter\outorb@bgluepen@do \else\ifnum\lastnodetype=13 \advance\pxrr@cnta\lastpenalty \unpenalty \expandafter\expandafter\expandafter\outorb@bgluepen@do \fi\fi }% }{% non e-TeX \def\outorb@bgluepen@do{% \outorb@bgluepen@remove \outorb@bgluepen@remove \outorb@bgluepen@remove \ifnum\lastskip=\ltx@zero\else \expandafter\outorb@bgluepen@do \else\ifnum\lastpenalty=\ltx@zero\else \expandafter\expandafter\expandafter\outorb@bgluepen@do \fi\fi }% } % \end{macrocode} % \par 0じゃない場合だけ追加。どっちにしろ削除するので意味は特にないような。 % \begin{macrocode} \def\outorb@bgluepen@remove{% \ifnum\lastskip=\ltx@zero\else \advance\ltx@LocSkipA\lastskip \fi \unskip \ifnum\lastpenalty=\ltx@zero\else \advance\pxrr@cnta\lastpenalty \fi \unpenalty } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \subsubsection{エピローグ} % % \begin{macro}{\outorb@epilogue} % 終了時の処理。 % \begin{macrocode} \def\outorb@epilogue{% % \end{macrocode} % \par \cs\outorb@discretionary で改行するため、ここで改行してはいけない。 % \begin{macrocode} \penalty\outorb@MM % \end{macrocode} % \par This can't happen対策。 % \begin{macrocode} \hbox{}\penalty\outorb@MM % \end{macrocode} % \par この後にユーザがペナルティやグルーを置いた場合、\cs\outorb@discretionary の直後で改行が発生し得るのでまずいことになる。 % ペナルティは無理だけど空白はなるべく無視するようにする。 % \begin{macrocode} \endgroup \pxrr@inhibitglue \ignorespaces } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsection{ハイフネーションペナルティ} % % \begin{macro}{\outorb@hyphen@check} % 各\cs{outoruby}でハイフネーションペナルティをチェックする。 % \begin{macrocode} \def\outorb@hyphen@check{% % \end{macrocode} % \par この値は要検討。 % \begin{macrocode} \ifnum\hyphenpenalty>\outorb@iM \outorb@hyphen@warn@nobreak % \end{macrocode} % \par この値も。 % \begin{macrocode} \else\ifnum\hyphenpenalty>100 \outorb@hyphen@warn@maynotbreak \fi\fi } % \end{macrocode} % \begin{macro}{\outorb@hyphen@warn@nobreak} % \begin{macro}{\outorb@warn@maynotbreak} % ハイフネーションペナルティが大きい場合に一度だけ警告を出す。 % \begin{macrocode} \def\outorb@hyphen@warn@nobreak{% \global\let\outorb@hyphen@warn@nobreak\relax \outorb@warn{% The \string\hyphenpenalty\ltx@space value \the\hyphenpenalty\ltx@space too large.\MessageBreak \string\outoruby will not break.\MessageBreak Using \string\outorubyhyphenbreakable\ltx@space may help it improve% }% } \def\outorb@hyphen@warn@maynotbreak{% \global\let\outorb@hyphen@warn@maynotbreak\relax \outorb@warn{% The \string\hyphenpenalty\ltx@space value \the\hyphenpenalty\ltx@space too large.\MessageBreak \string\outoruby may not break.\MessageBreak Using \string\outorubyhyphenbreakable\ltx@space may help it improve% }% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\outorubyhyphenbreakable} % \begin{macro}{\outorb@outorubyhyphenbreakable} % \@cs\outorubyhyphenbreakable[<n>] % \par <n>はハイフネーションでの分割のしにくさ。 % 0だとペナルティ0で、4だと最小限(9999)。 % ただしより大きい値にペナルティを更新することはない。 % \par どんな値にすべきかはよくわからない。 % \begin{macrocode} \outorb@errifdefined\outorubyhyphenbreakable \outorb@protected\def\outorubyhyphenbreakable{ \ltx@ifnextchar[{\outorb@hyphenbreakable}{\outorb@hyphenbreakable[0]}% } \let\outorb@hyphenbreakable\outorubyhyphenbreakable % \end{macrocode} % \begin{flushleft} % \begin{minipage}{0.5\textwidth}\centering % \begin{tabular}{ll} % \multicolumn{2}{c}{kernel} \\ % \toprule % \cs\hyphenpenalty & 50 \\ % \cs\doublehyphendemerits & 10000 \\ % \cs\finalhyphendemerits & 5000 \\ % \cs\linepenalty & 10 \\ % \bottomrule % \end{tabular}^^A % \end{minipage}\nobreak % \begin{minipage}{0.5\textwidth}\centering % \begin{tabular}{ll} % \multicolumn{2}{c}{\cls{classes}} \\ % \toprule % \cs\@lowpenalty & 51 \\ % \cs\@medpenalty & 151 \\ % \cs\@highpenalty & 301 \\ % \bottomrule % \end{tabular}^^A % \end{minipage}\\[\bigskipamount] % \begin{minipage}{0.5\textwidth}\centering % \begin{tabular}{ll} % \multicolumn{2}{c}{\file{kinsoku.tex}} \\ % \toprule % 小書のかな & 150 \\ % \bottomrule % \end{tabular}^^A % \end{minipage}\nobreak % \begin{minipage}{0.5\textwidth}\centering % \begin{tabular}{ll} % \multicolumn{2}{c}{\pLaTeX\ kernel} \\ % \toprule % \cs\jcharwidowpenalty & 500 \\ % \bottomrule % \end{tabular}^^A % \end{minipage} % \end{flushleft} % \begin{macrocode} \def\outorb@hyphenbreakable[#1]{% \outorb@hyphenpenalty@min\hyphenpenalty{\outorb@getpen{#1}}% \outorb@hyphenpenalty@min\doublehyphendemerits{\outorb@getpen{#1}}% \outorb@hyphenpenalty@min\finalhyphendemerits{\outorb@getpen{#1}}% } % \end{macrocode} % \par より小さくなる場合だけペナルティを更新。 % \begin{macrocode} \def\outorb@hyphenpenalty@min#1#2{% \ifnum#1>#2\relax #1=#2\relax \fi } % \end{macrocode} % \end{macro} % \end{macro} % % \subsection{\pkg{hyperref}対策} % % \begin{macro}{\outorb@exp@opt} % 完全展開可能にオプション部分を取得する。 % \begin{Verbatim} % \outoruby[][][\hspace{0.25\zw}][{\hspace{0.25\zw}}]{雪}{スノー} % \end{Verbatim} % のような引数を考慮する必要。 % \par 必須引数には\A{}を使用していることを前提としている。 % また\verb+{+以外のカテゴリコード1の文字は想定しておらず、グループが外れる恐れがある。 % \inarg1 <継続> % \par <継続>\A{<オプション部分>}の形で渡される。<オプション部分>には\A[]含む。 % \begin{macrocode} \def\outorb@exp@opt#1#2#{% \outorb@exp@opt@loop{#1}{}#2[\outorb@nil} \def\outorb@exp@opt@loop#1#2#3[#4\outorb@nil{% % \end{macrocode} % \par \verb+#2#{+で取得したので、このパターンマッチで最外\A{}が外れる心配はない。 % \begin{macrocode} \ltx@ifempty{#4}{% % \end{macrocode} % \par \verb+[+含まれてない場合は終了。 % \begin{macrocode} #1{#2#3}% }{% \outorb@exp@opt@chop@open{#1}{#2#3[}#4\outorb@nil }% } \def\outorb@exp@opt@chop@open#1#2#3[\outorb@nil{% \outorb@exp@opt@bracket{#1}{#2}#3]\outorb@nil } % \end{macrocode} % \par \verb+[+があったので\verb+]+があるか調べる。 % \begin{macrocode} \def\outorb@exp@opt@bracket#1#2#3]#4\outorb@nil{% \ltx@ifempty{#4}{% % \end{macrocode} % \par \verb+]+足りない。 % \A[]中に\A{}があったということなのでそれを考慮して\verb+]+まで取ってくる。 % ここだけ最外\A{}が外れないよう考慮する必要あり。 % \begin{macrocode} \outorb@exp@opt@brace{#1}{#2#3}.% }{% \outorb@exp@opt@chop@close{#1}{#2#3]}#4\outorb@nil }% } \def\outorb@exp@opt@brace#1#2#3]{% \expandafter\outorb@exp@opt@brace@next\expandafter{\ltx@gobble #3]}{#1}{#2}% } \def\outorb@exp@opt@brace@next#1#2#3#4#{% \outorb@exp@opt@loop{#2}{#3#1}#4[\outorb@nil } \def\outorb@exp@opt@chop@close#1#2#3]\outorb@nil{% \outorb@exp@opt@loop{#1}{#2}#3[\outorb@nil } % \end{macrocode} % \end{macro} % \par \pkg{hyperref}中で使われた場合は親文字のみ出力。 % \par \cs{ltx@GlobalAppendToMacro}等はマクロが未定義の場合空で初期化する。 % \begin{macrocode} \ltx@GlobalAppendToMacro\pdfstringdefPreHook{% \def\outoruby{% \outorb@exp@opt\ltx@secondofthree }% \let\outorb@outoruby\outoruby } % \end{macrocode} % \begin{macrocode} %</pkg> % \end{macrocode} % % \Finale % % \catcode`\#=6 % \setlength\marginparwidth{10\zw} % \begin{fullwidth} % % \section{開発} % % このパッケージは\href{https://www.gnu.org/licenses/gpl-3.0.html}{GNU General Public License Version 3}で配布される。 % % リポジトリは % \begin{quote} % \url{https://codeberg.org/kkotsi/outoruby} % \end{quote} % である。バグ報告などはこちらに連絡されたい。 % % \raggedcolumns % \renewcommand\indexname{インデックス} % \IndexPrologue{\section{\indexname}} % \PrintIndex % \setcounter{GlossaryColumns}{3} % \renewcommand\glossaryname{更新履歴} % \GlossaryPrologue{\section{\glossaryname}} % \PrintChanges % \end{fullwidth} %