texlive[74395] branches/branch2024.final/Master: outoruby (branch)

commits+karl at tug.org commits+karl at tug.org
Sun Mar 2 22:43:11 CET 2025


Revision: 74395
          https://tug.org/svn/texlive?view=revision&revision=74395
Author:   karl
Date:     2025-03-02 22:43:10 +0100 (Sun, 02 Mar 2025)
Log Message:
-----------
outoruby (branch) (2mar25)

Modified Paths:
--------------
    branches/branch2024.final/Master/tlpkg/libexec/ctan2tds
    branches/branch2024.final/Master/tlpkg/tlpsrc/collection-langjapanese.tlpsrc

Added Paths:
-----------
    branches/branch2024.final/Master/texmf-dist/doc/latex/outoruby/
    branches/branch2024.final/Master/texmf-dist/doc/latex/outoruby/README.md
    branches/branch2024.final/Master/texmf-dist/doc/latex/outoruby/outoruby.pdf
    branches/branch2024.final/Master/texmf-dist/source/latex/outoruby/
    branches/branch2024.final/Master/texmf-dist/source/latex/outoruby/outoruby.dtx
    branches/branch2024.final/Master/texmf-dist/tex/latex/outoruby/
    branches/branch2024.final/Master/texmf-dist/tex/latex/outoruby/outoruby.sty
    branches/branch2024.final/Master/tlpkg/tlpsrc/outoruby.tlpsrc

Added: branches/branch2024.final/Master/texmf-dist/doc/latex/outoruby/README.md
===================================================================
--- branches/branch2024.final/Master/texmf-dist/doc/latex/outoruby/README.md	                        (rev 0)
+++ branches/branch2024.final/Master/texmf-dist/doc/latex/outoruby/README.md	2025-03-02 21:43:10 UTC (rev 74395)
@@ -0,0 +1,22 @@
+# The outoruby package
+
+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.
+
+For details, see outoruby.pdf (Japanese).
+
+## Installation
+
+For instructions on how to generate the package file (`outoruby.sty`) and the documentation (`outoruby.pdf`), see the meta-comment at the beginning of `outoruby.dtx`.
+
+## Copyright
+
+Copyright (c) 2025 kkotsi
+
+This project is distributed under the [GNU General Public License Version 3](https://www.gnu.org/licenses/gpl-3.0.html).
+
+Repository: https://codeberg.org/kkotsi/outoruby
+
+README.md v0.0.0
\ No newline at end of file


Property changes on: branches/branch2024.final/Master/texmf-dist/doc/latex/outoruby/README.md
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: branches/branch2024.final/Master/texmf-dist/doc/latex/outoruby/outoruby.pdf
===================================================================
(Binary files differ)

Index: branches/branch2024.final/Master/texmf-dist/doc/latex/outoruby/outoruby.pdf
===================================================================
--- branches/branch2024.final/Master/texmf-dist/doc/latex/outoruby/outoruby.pdf	2025-03-02 21:41:07 UTC (rev 74394)
+++ branches/branch2024.final/Master/texmf-dist/doc/latex/outoruby/outoruby.pdf	2025-03-02 21:43:10 UTC (rev 74395)

Property changes on: branches/branch2024.final/Master/texmf-dist/doc/latex/outoruby/outoruby.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: branches/branch2024.final/Master/texmf-dist/source/latex/outoruby/outoruby.dtx
===================================================================
--- branches/branch2024.final/Master/texmf-dist/source/latex/outoruby/outoruby.dtx	                        (rev 0)
+++ branches/branch2024.final/Master/texmf-dist/source/latex/outoruby/outoruby.dtx	2025-03-02 21:43:10 UTC (rev 74395)
@@ -0,0 +1,2794 @@
+% \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 at compose@oneside at block@do\pxrr at compose@oneside at block@do
+  \patchcmd\@@pxrr at compose@oneside at block@do{%
+    \pxrr at evenspace@int{#1}\pxrr at boxr
+  }{%
+    \pxrr at evenspace@int{\pxrr at locate@inner}\pxrr at boxr
+  }{%
+    \newcommand\pxpatchon{%
+      \let\pxrr at compose@oneside at block@do\@@pxrr at compose@oneside at block@do}
+  }{%
+    \let\@@pxrr at compose@block\pxrr at compose@block
+    \patchcmd\@@pxrr at compose@block{%
+      \pxrr at evenspace@int{#1}\pxrr at boxr
+    }{%
+      \pxrr at evenspace@int{\pxrr at locate@inner}\pxrr at boxr
+    }{%
+      \newcommand\pxpatchon{%
+        \let\pxrr at compose@block\@@pxrr at 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 at family}^^A
+%     \edef\y{\ttdefault}^^A
+%     \edef\z{\k at 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 at 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 at 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 at macroname}^^A
+%   \ifx\em@@list\@undefined
+%     \global\expandafter\def\expandafter\em@@list\expandafter{\em@@savedname}^^A
+%   \else
+%     \ifem@@lastand
+%       \expandafter\ltx at GlobalPrependToMacro\expandafter\em@@list\expandafter{\em@@savedname\em@@andlast}^^A
+%     \else
+%       \expandafter\ltx at 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 at 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 at ifempty{#3}{#1}{^^A
+%     \c@@arg #1$_{#2}$\met@#3\@nil}}
+% \let\@@outorb at opt@opt\outorb at opt@opt
+% \def\outorb at opt@opt#1\outorb at nil{^^A
+%   \begingroup
+%     \edef<{\string<}^^A
+%     \protected at edef\x{#1}^^A
+%   \expandafter\endgroup\expandafter\@@outorb at opt@opt\x\outorb at nil}
+%
+% \DeclareRobustCommand*\cs{^^A
+%   \ltx at 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 at ifnextchar\bgroup{\cs@@\c@@arg}{\cs@@@\c@@arg}}
+%
+% \DeclareRobustCommand\A{^^A
+%   \ltx at 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 at inter{\cs{pxrr at inter}\c@@arg}
+% \def\pxrr at pre{\cs{pxrr at pre}\c@@arg}
+% \def\pxrr at post{\cs{pxrr at post}\c@@arg}
+% \def\c@@arg{^^A
+%   \ltx at ifnextchar\bgroup{\c@@@rg}{^^A
+%     \ltx at 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 at 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 at b{#1}}{#1}}
+% \def\@@argbrace at b#1#2{#1{{#2}}}
+%
+% \newcommand*\headitem[1]{^^A
+%   \if@@movemarginpar \@@movemarginparfalse \fi
+%   \par\noindent\hb at 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 at maketitle
+% \end{savenotes}
+% \begin{abstract}
+%   \pxrbpkg をラップし、
+%   \outoruby{自動}{じ|どう}で\outoruby[||-][-|]{行頭形}{ぎょう|とう|けい}/
+%   \outoruby{行中形}{ぎょう|ちゅう|けい}/\outoruby[-||][|-]{行末形}{ぎょう|まつ|けい}
+%   を\outoruby{切}{き}り\outoruby{替}{か}えられるるルビ\outoruby[-:]{命令}{めい|れい}\cs{outoruby}を
+%   \outoruby[<>]{提供}{てい|きょう}する。
+%   \outoruby{実装}{じっ|そう}は\cs{discretionary}による。
+% \end{abstract}
+%
+% \renewcommand*{\l at subsection}{\@dottedtocline{2}{1\zw}{2\zw}}
+% \renewcommand*{\l at 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 at 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 at outorubysetup
+% \cs{outorubysetup}と等価。
+%
+% \medskip
+%
+% \desccs\outorubyhyphenbreakable[<i>]
+%
+% \ref{sec:hyphpen}説で再度説明するが、\cs{outoruby}はハイフネーション関係の設定の影響を受ける。
+% もしもハイフネーションが一切発生しないよう設定した場合、\cs{outoruby}のルビ中での行分割も禁止される可能性がある\footnote{^^A
+%   \vadjust{^^A
+%     \hb at 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 at outorubyhyphenbreakable
+% \cs{outorubyhyphenbreakable}と等価。
+%
+% \medskip
+%
+% \desccs\outorb at 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 at discretionary}を使った場合で行分割が発生した場合、正しい出力を得るには
+% 複数回の\LaTeX の処理が必要になる場合がある。
+% \marginfig{\def\outorb at aux@write#1{}\raggedleft\fboxsep5\p@\fbox{\parbox{2.5\zw}{\leavevmode
+%   \outoruby{重複受精}{ちょう|ふく|じゅ|せい}}}}^^A
+% \marginpar{\vskip3pt}^^A
+% \marginfig{\@namedef{outorb at disc@break@\the\outorb at 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 at compose@oneside at block@do{%
+%     \pxrr at evenspace@int{#1}\pxrr at boxr
+%   }{%
+%     \pxrr at evenspace@int{\pxrr at locate@inner}\pxrr at 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 at 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 at 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 at 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 at pkgname}
+% \begin{macro}{\outorb at err}
+% \begin{macro}{\outorb at warn}
+% \begin{macro}{\outorb at warn@noln}
+%   エラーや警告など。
+%    \begin{macrocode}
+\def\outorb at pkgname{outoruby}
+\def\outorb at err#1{%
+  \@PackageError\outorb at pkgname{#1}\@ehc
+}
+\def\outorb at warn{%
+  \@PackageWarning\outorb at pkgname
+}
+\def\outorb at warn@noln{%
+  \@PackageWarningNoLine\outorb at 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 at safe@mode}
+%   \task \cs\rubynousejghost
+%   \task \cs{pxrr at po@TR@}\globstar
+%   \task \cs{pxrr at 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 at cnta
+%   \task \cs\pxrr at decompbar
+%   \task \cs\pxrr at decompose
+%   \task \cs\pxrr at if@last
+%   \task \cs\pxrr at unite@group
+%   \task \cs\pxrr at zip@list
+%   \task \cs\pxrr at ifprimitive
+%   \task \cs\pxrr at inhibitglue
+%   \task \cs{ifpxrr at abody}
+%   \task \cs\pxrr at check@kinsoku
+% \end{tasks}
+%
+% \begin{macro}{\ifpxrr at safe@mode}
+% \begin{macro}{\pxrr at unite@group}
+% \begin{macro}{\pxrr at ifprimitive}
+% \begin{macro}{\pxrr at inhibitglue}
+% \pxrbpkg のバージョンによっては定義されてない可能性がある命令の代替定義。
+%    \begin{macrocode}
+\expandafter\ifx\csname ifpxrr at safe@mode\endcsname\relax
+  \expandafter\let\csname ifpxrr at safe@mode\expandafter\endcsname\csname iffalse\endcsname
+\fi
+\expandafter\ifx\csname pxrr at unite@group\endcsname\relax
+  \def\pxrr at unite@group#1{%
+    \def\pxrr at inter##1{%
+      \ltx at LocalAppendToMacro#1{##1}%
+    }%
+    \def\pxrr at pre{%
+      \let#1\ltx at empty
+      \pxrr at inter
+    }%
+    \def\pxrr at post{%
+      \expandafter\def\expandafter#1\expandafter{%
+        \expandafter\pxrr at pre\expandafter{#1}\pxrr at post
+      }%
+    }%
+    #1%
+  }
+\fi
+\expandafter\ifx\csname pxrr at ifprimitive\endcsname\relax
+  \def\pxrr at ifprimitive#1#2#3{#3}
+\fi
+\expandafter\ifx\csname pxrr at inhibitglue\endcsname\relax
+  \let\pxrr at 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 at LocalPrependToMacro
+\RequirePackage{infwarerr}
+%    \end{macrocode}
+%
+% \subsubsection{フォーマット依存命令}
+%
+% \begin{macro}{\outorb at disc@count}
+% \cs{outorb at discretionary}で\cs{outorb at discretionary}ごとのユニークな識別子に用いる。
+% \begin{macro}{\outorb at disc@box}
+% \cs{outorb at discretionary}で\meta{no-break}を保持するユニークなboxレジスタ。
+%    \begin{macrocode}
+\newcount\outorb at disc@count
+\newbox\outorb at disc@box
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\outorb at thepage}
+% \begin{macro}{\outorb at aux@write}
+% \begin{macro}{\outorb at aux@write at immediate}
+% \begin{macro}{\outorb at AtBeginDocument}
+% \begin{macro}{\outorb at AtEndDocument}
+% \begin{macro}{\outorb at labelchanged}
+% \begin{macro}{\outorb at aux@write at providecommand}
+% \begin{macro}{\outorb at errifdefined}
+% \begin{macro}{\outorb at MM}
+% \begin{macro}{\outorb at iM}
+% \par \pxrbpkg 、\pkg{ltxcmds}、\pkg{infwarerr}、\pkg{outoruby}以外で定義されている命令はここでラップする。
+%    \begin{macrocode}
+\def\outorb at thepage{\thepage}
+\def\outorb at aux@write#1{%
+  \protected at write\@auxout{}{#1}%
+}
+\def\outorb at aux@write at immediate{%
+  \immediate\write\@auxout
+}
+\def\outorb at AtBeginDocument{%
+  \AtBeginDocument
+}
+\def\outorb at AtEndDocument{%
+  \AtEndDocument
+}
+\def\outorb at labelchanged{%
+  \@tempswatrue
+}
+\def\outorb at aux@write at providecommand#1{%
+  \string\providecommand\string#1%
+}
+\def\outorb at errifdefined#1{%
+  \newcommand#1{}%
+}
+\mathchardef\outorb at MM=20000
+\mathchardef\outorb at 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 at 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 at getpen{\@getpen}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at protected}
+% \par \cs{protected}がある場合\verb+\protected\def+、なければ定義後に\cs{MakeRobust}相当の処理。
+% \inarg1 \cs{def}
+% \inarg2 \CS
+%    \begin{macrocode}
+\pxrr at ifprimitive\protected{% e-TeX
+  \def\outorb at protected#1#2{%
+    \protected#1#2%
+  }%
+}{% non e-TeX
+  \def\outorb at protected#1#2{%
+    \def\outorb at protected@tempa{#2}%
+    \afterassignment\outorb at protected@makerobust
+    #1#2%
+  }%
+%    \end{macrocode}
+% \begin{macro}{\outorb at protected@makerobust}
+% \par \cs{MakeRobust}相当の処理。
+% \LaTeX でしか正常に動かないので注意。
+% Contorol symbolのことは考慮していない。
+%    \begin{macrocode}
+  \def\outorb at protected@makerobust{%
+    \begingroup
+      \escapechar=\ltx at minusone
+      \edef\outorb at tempa{%
+        \def\noexpand\outorb at tempa{%
+          \expandafter\string\outorb at protected@tempa
+        }%
+      }%
+    \expandafter\endgroup\outorb at tempa
+    \expandafter\let\csname
+      \outorb at tempa\ltx at space\expandafter\endcsname
+      \csname \outorb at tempa\endcsname
+    \expandafter\edef\csname \outorb at tempa\expandafter\endcsname{%
+      \noexpand\protect
+      \expandafter\noexpand\csname \outorb at tempa\ltx at space\endcsname
+    }%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{擬似多重\cs{discretionary}}
+%
+% \begin{macro}{\outorb at discretionary}
+% \@cs{outorb at 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 at protected\def\outorb at discretionary#1#2{%
+  \begingroup
+%    \end{macrocode}
+% \par <no-break>の幅が必要なので取得。
+% #1中でスクラッチレジスタを使ってるかもしれないのでユニークなレジスタ。
+%    \begin{macrocode}
+  \setbox\outorb at disc@box=\hbox{#2}%
+  \ltx at ifblank{#1}{%
+%    \end{macrocode}
+% \inarg1 \<(空)
+% \par \cs\discretionary にしない。
+%    \begin{macrocode}
+    \unhbox\outorb at 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 at decompose\expandafter\expandafter\expandafter{%
+      \ltx at zapspace{#1}%
+    }%
+%    \end{macrocode}
+% \result\pxrr at res\pxrr at pre{{<pre-break_1>}}\pxrr at inter{{<post-break_1>}}\ldots\pxrr at inter{{<post-break_n>}}\pxrr at post
+% \par 最外に\verb+{}+が増える\cs{pxrr at decompose}の仕様はとりあえず気にしない。
+% \par #2の空白は\cs{ltx at zapspace}で無視。
+%    \begin{macrocode}
+    \let\pxrr at inter\outorb at disc@inter
+    \let\pxrr at pre\pxrr at inter
+    \let\pxrr at post\outorb at disc@post
+    \pxrr at res
+  }%
+}
+%    \end{macrocode}
+% \begin{macro}{\outorb at disc@post}
+% \par \cs{outorb at discretionary}の終了処理。
+%    \begin{macrocode}
+\def\outorb at disc@post{%
+  \global\advance\outorb at disc@count\ltx at one
+  \endgroup
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at disc@inter}
+% \par\cs{discretionary}組み立て。
+% \inarg1<pre-break_n>
+% \inarg2\pxrr at inter
+% \inarg3<post-break_n>
+%    \begin{macrocode}
+\def\outorb at disc@inter#1#2#3{%
+  \ifx\pxrr at inter#2\else
+%    \end{macrocode}
+% \inarg2\pxrr at post
+%    \begin{macrocode}
+    \outorb at err{%
+      Extra pre-break, or forgotten post-break in \string\outorb at discretionary
+    }%
+  \fi
+  \pxrr at if@last{%
+    \discretionary{%
+      \outorb at disc@break at pre
+      #1%
+    }{%
+      #3%
+    }{%
+      \outorb at disc@nobreak
+      \outorb at disc@ifbreakTF{\kern\wd\outorb at disc@box}{\unhbox\outorb at disc@box}}%
+  }{%
+    \discretionary{%
+      \outorb at disc@break at pre
+      #1%
+    }{%
+      #3\outorb at disc@break at post
+    }{}%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \par Aux書き出し。
+% Discretionaryにwhatsitを入れるにはhbox等で包む必要。
+%
+% \begin{macro}{\outorb at disc@break at post}
+% \begin{macro}{\outorb at disc@break at record}
+% <post-break>の場合。
+%    \begin{macrocode}
+\def\outorb at disc@break at post{%
+  \hbox{\outorb at aux@write{%
+%    \end{macrocode}
+% \par 分割したことを記録。次回<no-break>を出力しない。
+%    \begin{macrocode}
+    \string\outorb at disc@break at aux{\the\outorb at disc@count}{\outorb at thepage}{\the\inputlineno}%
+      {\outorb at disccommand}%
+%    \end{macrocode}
+% \par \cs{csname}トリックで分割を記録し、複数箇所での分割を検出。
+% <post-break_n>と<pre-break_{n+1}>は複数回行分割しても必ず同じ行、つまり同じ\cs{shipout}中にある。
+% 重複検出は<pre-break>で。
+%    \begin{macrocode}
+    \noexpand\outorb at disc@break at record{\the\outorb at disc@count}%
+  }}%
+%    \end{macrocode}
+% \par <no-break>の負の幅のカーン。
+%    \begin{macrocode}
+  \kern-\wd\outorb at disc@box
+}
+\def\outorb at disc@break at record#1{%
+  \expandafter\ltx at gobble\csname outorb at disc@break at check@#1\endcsname
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\outorb at disc@break at pre}
+% \begin{macro}{\outorb at disccommand}
+% \begin{macro}{\outorb at disc@break at check}
+% \par <pre-break>の場合。
+% これがあるのでpre-breakは空にならず\cs{hyphenpenalty}。
+% 複数箇所での分割を検出しエラーにする。
+%    \begin{macrocode}
+\def\outorb at disc@break at pre{%
+  \hbox{\outorb at aux@write{%
+    \noexpand\outorb at disc@break at check{\the\outorb at disc@count}{\the\inputlineno}%
+      {\outorb at disccommand}%
+      \expandafter\noexpand\csname outorb at disc@break at check@\the\outorb at disc@count\endcsname
+  }}%
+}
+\def\outorb at disccommand{\noexpand\outorb at discretionary}
+\def\outorb at disc@break at check#1#2#3#4{%
+  \ifx#4\relax
+    \expandafter\outorb at disc@break at check@error\expandafter{%
+      \romannumeral-`0\outorb at thepage}{#1}{#2}{#3}%
+  \fi
+}
+%    \end{macrocode}
+% \begin{macro}{\outorb at disc@break at check@error}
+% \par 完全展開可能なエラー。expl3の\cs{msg\_expandable\_error}あたりの実装を参考にした。
+%    \begin{macrocode}
+\def\outorb at tempa#1{%
+  \def\outorb at disc@break at check@error##1##2##3##4{%
+    \expandafter\expandafter\expandafter\ltx at carzero\ltx at firstofone{%
+      #1##4at line ##3 break twice in p.##1. (##2)}%
+    \@nil
+  }%
+}
+\ltx at LocalExpandAfter\outorb at tempa\csname
+  outoruby.sty Error:\endcsname
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\outorb at disc@nobreak}
+% \par <no-break>の場合。
+% 確実に\cs{outorb at disc@break}より後なので
+% Label(s) may have changed.検出(分割していたのが分割しなくなった場合)用。
+%    \begin{macrocode}
+\def\outorb at disc@nobreak{%
+  \hbox{\outorb at aux@write{%
+    \string\outorb at disc@nobreak at aux{\the\outorb at disc@count}{\outorb at thepage}{\the\inputlineno}%
+      {\outorb at disccommand}%
+  }}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at disc@ifbreakTF}
+% \par 前回処理時に処理中の\cs{outorb at discretionary}分割したか。
+% <no-break>を描画するか代わりに同じ幅のkernにするか。
+%    \begin{macrocode}
+\def\outorb at disc@ifbreakTF{%
+  \expandafter\ifx\csname outorb at disc@break@\the\outorb at disc@count\endcsname\relax
+    \expandafter\ltx at secondoftwo
+  \else
+    \expandafter\ltx at firstoftwo
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at disc@break at aux}
+% \par Auxに書き込まれる命令。
+% \inarg1 Id(\cs{outorb at disc@count}由来)
+% \inarg2 \cs{outorb at discretionary}が使われた行番号
+% \inarg3 \cs{outorb at discretionary}が実際に出力されたページ(\cs{outorb at thepage}由来)
+% \inarg4 警告に使うコマンド名(\cs{outorb at disccommand}由来)
+%    \begin{macrocode}
+\def\outorb at disc@break at aux#1#2#3#4{%
+  \expandafter\ifx\csname outorb at disc@break@#1\endcsname\relax
+    \global\expandafter\def\csname outorb at disc@break@#1\endcsname{}%
+  \else
+%    \end{macrocode}
+% \par 以前のタイプセットで複数箇所で分割した場合警告。
+% 何回も出るかもしれないけどまあいいや。
+%    \begin{macrocode}
+    \begingroup
+    \ltx at LocToksA{#4}%
+    \outorb at warn@noln{%
+      \the\ltx at LocToksA at page #2 line #3 broke twice at last typeset.\MessageBreak
+      The result may be incorrect%
+    }%
+    \endgroup
+  \fi
+}
+%    \end{macrocode}
+% \begin{macro}{\outorb at disc@nobreak at aux}
+% これはLabel(s) may have changed.用なので\verb+\begin{document}+では出番なし。
+%    \begin{macrocode}
+\def\outorb at disc@nobreak at aux#1#2#3#4{%
+}
+%    \end{macrocode}
+% \par \pkg{outoruby}の読み込みをやめた場合にエラーを出さない。
+%    \begin{macrocode}
+\outorb at AtBeginDocument{%
+  \outorb at aux@write at immediate{%
+    \outorb at aux@write at providecommand\outorb at disc@break at aux[4]{}%
+    \outorb at aux@write at providecommand\outorb at disc@nobreak at aux[4]{}%
+  }%
+}
+%    \end{macrocode}
+% \par Label(s) may have changed.
+%    \begin{macrocode}
+\outorb at AtEndDocument{%
+  \def\outorb at disc@break at aux#1#2#3#4{%
+    \expandafter\ifx\csname outorb at disc@break@#1\endcsname\relax
+%    \end{macrocode}
+% \par 分割していなかったのが分割するようになった場合。
+%    \begin{macrocode}
+      \outorb at labelchanged
+    \fi
+    \expandafter\def\csname outorb at disc@break at enddoc@#1\endcsname{}%
+  }%
+  \def\outorb at disc@nobreak at aux#1#2#3#4{%
+    \expandafter\ifx\csname outorb at disc@break@#1\endcsname\relax\else% break last time
+      \expandafter\ifx\csname outorb at disc@break at enddoc@#1\endcsname\relax% no break current time
+%    \end{macrocode}
+% \par 分割していたのがしなくなった場合。
+%    \begin{macrocode}
+        \outorb at labelchanged
+      \fi
+    \fi
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{リスト処理}
+%
+% \pxrbpkg の\pxrr at pre 、\pxrr at inter 、\pxrr at post によるリストを利用。
+% \pxrbpkg にならい、一般にグルーピングはしておらず\cs{pxrr at pre}などの定義を上書きするので注意。
+% \pxrbpkg がグルーピングしてないのは多分処理効率のため。
+%
+% \begin{macro}{\outorb at pxrr@reverse}
+% \movempar
+% \inarg1 \pxrr at pre{<X_1>}\pxrr at inter{<X_2>}\ldots\pxrr at inter{<X_n>}\pxrr at post
+% \result\outorb at res \pxrr at pre{<X_n>}\ldots\pxrr at inter{<X_2>}\pxrr at inter{<X_1>}\pxrr at post
+%    \begin{macrocode}
+\def\outorb at pxrr@reverse at list#1{%
+  \let\outorb at res\ltx at empty
+  \def\pxrr at pre##1{%
+    \ltx at LocalPrependToMacro\outorb at res{%
+      {##1}\pxrr at post
+    }%
+  }%
+  \def\pxrr at inter##1{%
+    \ltx at LocalPrependToMacro\outorb at res{%
+      {##1}\pxrr at inter
+    }%
+  }%
+  \def\pxrr at post{%
+    \ltx at LocalPrependToMacro\outorb at res{%
+      \pxrr at pre
+    }%
+  }%
+  #1%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at pxrr@step at list}
+% \movempar
+% \inarg1 \pxrr at pre{<X_1>}\pxrr at inter{<X_2>}\ldots\pxrr at inter{<X_n>}\pxrr at post
+% \result\outorb at res
+% \pxrr at pre{\pxrr at post}\ttend1
+% \pxrr at inter{\pxrr at pre{<X_1>}\pxrr at post}\ttend1
+% \pxrr at inter{\pxrr at pre{<X_1>}\pxrr at inter{<X_2>}\pxrr at post}\ttend1
+% \texttt\vdots\\\ttindent
+% \pxrr at inter{\pxrr at pre{<X_1>}\pxrr at inter{<X_2>}\ldots\pxrr at inter{<X_n>}\pxrr at post}\ttend1
+% \pxrr at post
+%    \begin{macrocode}
+\def\outorb at pxrr@step at list#1{%
+  \def\outorb at res{\pxrr at pre{\pxrr at post}}%
+  \def\pxrr at pre##1##2{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at inter{%
+        \pxrr at pre{##1}\pxrr at post
+      }%
+    }%
+    ##2{\pxrr at pre{##1}}%
+  }%
+  \def\pxrr at inter##1##2##3{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at inter{%
+        ##1\pxrr at inter{##2}\pxrr at post
+      }%
+    }%
+    ##3{##1\pxrr at inter{##2}}%
+  }%
+  \def\pxrr at post##1{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at post
+    }%
+  }%
+  #1%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at pxrr@rstep at list}
+% \movempar
+% \inarg1 \pxrr at pre{<X_1>}\pxrr at inter{<X_2>}\ldots\pxrr at inter{<X_n>}\pxrr at post
+% \result\outorb at res
+% \pxrr at pre{\pxrr at post}\ttend1
+% \pxrr at inter{\pxrr at pre{<X_1>}\pxrr at post}\ttend1
+% \pxrr at inter{\pxrr at pre{<X_2>}\pxrr at inter{<X_1>}\pxrr at post}\ttend1
+% \texttt\vdots\\\ttindent
+% \pxrr at inter{\pxrr at pre{<X_n>}\ldots\pxrr at inter{<X_2>}\pxrr at inter{<X_1>}\pxrr at post}\ttend1
+% \pxrr at post
+%    \begin{macrocode}
+\def\outorb at pxrr@rstep at list#1{%
+  \def\outorb at res{\pxrr at pre{\pxrr at post}}%
+  \def\pxrr at pre##1##2{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at inter{%
+        \pxrr at pre{##1}\pxrr at post
+      }%
+    }%
+    ##2{\pxrr at inter{##1}\pxrr at post}%
+  }%
+  \def\pxrr at inter##1##2##3{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at inter{%
+        \pxrr at pre{##2}##1%
+      }%
+    }%
+    ##3{\pxrr at inter{##2}##1}%
+  }%
+  \def\pxrr at post##1{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at post
+    }%
+  }%
+  #1%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at pxrr@product at list}
+% \movempar
+% \inarg1 \pxrr at pre{<X_1>}\pxrr at inter{<X_2>}\ldots\pxrr at inter{<X_n>}\pxrr at post
+% \result\outorb at res
+% \pxrr at pre\\\@@ttend2
+%   \A{\pxrr at post}\ttend2
+%   \A{\pxrr at pre{<X_1>}\pxrr at inter{<X_2>}\ldots\pxrr at inter{<X_n>}\pxrr at post}\ttend1
+% \pxrr at inter\\\@@ttend2
+%   \A{\pxrr at pre{<X_1>}\pxrr at post}\ttend2
+%   \A{\pxrr at pre{<X_2>}\ldots\pxrr at inter{<X_n>}\pxrr at post}\ttend1
+% \vdots\\\ttindent
+% \pxrr at inter\\\@@ttend2
+%   \A{\pxrr at pre{<X_1>}\pxrr at inter{<X_2>}\ldots\pxrr at inter{<X_n>}\pxrr at post}\ttend2
+%   \A{\pxrr at post}\ttend1
+% \pxrr at post
+%    \begin{macrocode}
+\def\outorb at pxrr@product at list#1{%
+  \outorb at pxrr@step at list{#1}%
+  \let\outorb at pxrr@product at list@tempa\outorb at res
+  \outorb at pxrr@reverse at list{#1}%
+  \expandafter\outorb at pxrr@rstep at list\expandafter{\outorb at res}%
+  \expandafter\outorb at pxrr@reverse at list\expandafter{\outorb at res}%
+  \pxrr at zip@list\outorb at pxrr@product at list@tempa\outorb at res
+  \let\outorb at res\pxrr at res
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at pxrr@join at list}
+% \movempar
+% \inarg1 <|>
+% \inarg2 \pxrr at pre{<X_1>}\pxrr at inter{<X_2>}\ldots\pxrr at inter{<X_n>}\pxrr at post
+% \result\outorb at res
+%   <X_1><|><X_2><|>\ldots <|><X_n>
+%    \begin{macrocode}
+\def\outorb at pxrr@join at list#1#2{%
+  \let\outorb at res\ltx at empty
+  \def\pxrr at inter##1{%
+    \pxrr at if@last{%
+      \ltx at LocalAppendToMacro\outorb at res{##1}%
+    }{%
+      \ltx at LocalAppendToMacro\outorb at res{##1#1}%
+    }%
+  }%
+  \let\pxrr at pre\pxrr at inter
+  \def\pxrr at post{\ltx at gobble\pxrr at post}%
+  #2%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at pxrr@pair at list}
+% \movempar
+% \inarg1 \pxrr at pre{<X_1>}{<Y_1>}\pxrr at inter{<X_2>}{<Y_2>}\ldots\pxrr at inter{<X_n>}{<Y_n>}\pxrr at post
+% \result\outorb at res
+% \pxrr at pre{{<X_1>}{<Y_1>}}\pxrr at inter{{<X_2>}{<Y_2>}}\ldots\pxrr at inter{{<X_n>}{<Y_n>}}\pxrr at post
+%    \begin{macrocode}
+\def\outorb at pxrr@pair at list#1{%
+  \let\outorb at res\ltx at empty
+  \def\pxrr at pre##1##2{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at pre{{##1}{##2}}%
+    }%
+  }%
+  \def\pxrr at inter##1##2{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at inter{{##1}{##2}}%
+    }%
+  }%
+  \def\pxrr at post{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at post
+    }%
+  }%
+  #1%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at pxrr@ifemptyTF}
+% #1が\pxrr at post のみからなるか。
+%    \begin{macrocode}
+\def\outorb at pxrr@ifemptyTF#1{%
+  \begingroup
+  \def\outorb at tempa{#1}%
+  \def\outorb at tempb{\pxrr at post}%
+  \expandafter\endgroup\ifx\outorb at tempa\outorb at tempb
+    \expandafter\ltx at firstoftwo
+  \else
+    \expandafter\ltx at secondoftwo
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{オプション解析}
+%
+% \begin{macro}{\outorb at ifstreqTF}
+% #1と#2が文字列として等しいか(完全展開して比較)。
+%    \begin{macrocode}
+\def\outorb at ifstreqTF#1#2{%
+  \begingroup
+  \edef\outorb at tempa{#1}%
+  \edef\outorb at tempb{#2}%
+  \expandafter\endgroup\ifx\outorb at tempa\outorb at tempb
+    \expandafter\ltx at firstoftwo
+  \else
+    \expandafter\ltx at secondoftwo
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\pxrbpkg のオプションパース}
+%
+% \begin{macro}{\outorb at opt@parse}
+% オプションを解析して分類。
+% \inarg1 \cs{jruby}の<option>に相当するもの(\oarg[]なし)。
+% \result\outorb at opt@parse at bintr 前進入設定
+% \result\outorb at opt@parse at bsub 前補助設定
+% \result\outorb at opt@parse at mode モード
+% \result\outorb at opt@parse at asub 後補助設定
+% \result\outorb at opt@parse at aintr 後進入設定
+% \par \pxrbpkg の有限オートマトンのパラメタを参照。
+% \begin{flushleft}
+%   \begin{tabular}{ll}
+%     \toprule
+%     \cs\outorb at po@FS & 現在の状態 \\
+%     \cs\pxrr at po@C@<文字> & 文字クラス \\
+%     \cs\pxrr at po@TR@<現在の状態>@<文字クラス> & 遷移先の状態 \\
+%     \bottomrule
+%   \end{tabular}
+% \end{flushleft}
+%    \begin{macrocode}
+\def\outorb at opt@parse#1{%
+  \outorb at ifstreqTF{#1}{||}{%
+    \def\outorb at opt@opt{|-|}%
+  }{%
+    \edef\outorb at opt@opt{#1}%
+  }%
+  \let\outorb at opt@parse at bintr\ltx at empty
+  \let\outorb at opt@parse at bsub\ltx at empty
+  \let\outorb at opt@parse at mode\ltx at empty
+  \let\outorb at opt@parse at asub\ltx at empty
+  \let\outorb at opt@parse at aintr\ltx at empty
+  \def\outorb at po@FS{bi}%
+  \expandafter\outorb at opt@parse at loop\outorb at opt@opt @\outorb at end
+}
+%    \end{macrocode}
+% \begin{macro}{\outorb at opt@parse at loop}
+% 有限オートマトン。
+%    \begin{macrocode}
+\def\outorb at opt@parse at loop#1{%
+  \if#1@%
+    \expandafter\outorb at opt@parse at exit
+  \fi
+  \ltx at ifundefined{pxrr at po@C@#1}{%
+    \outorb at err{%
+      Unexpected letter `#1' found%
+    }%
+  }{%
+    \expandafter\let\expandafter\outorb at po@FS\csname
+      pxrr at po@TR@\outorb at po@FS @\csname pxrr at po@C@#1\endcsname\endcsname
+    \ifx\outorb at po@FS\relax
+      \outorb at 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 at po@FS <遷移先>
+% \par 遷移先から設定の種類を分類。
+%    \begin{macrocode}
+    \outorb at ifstreqTF{\outorb at po@FS}{bi}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at bintr{#1}%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{bb}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at bintr{#1}%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{bs}{%
+      \outorb at ifstreqTF{\csname pxrr at po@C@#1\endcsname}{S}{%
+        \ltx at LocalAppendToMacro\outorb at opt@parse at bsub{#1}%
+      }{%
+        \ltx at LocalAppendToMacro\outorb at opt@parse at bintr{#1}%
+      }%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{mi}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at mode{#1}%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{as}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at asub{#1}%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{ai}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at asub{#1}%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{ab}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at aintr{#1}%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{fi}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at aintr{#1}%
+    }{%
+      \outorb at err{%
+        This can happen, may be a bug.\MessageBreak
+        (\outorb at po@FS)\MessageBreak
+        pxrubrica: \csname ver at pxrubrica.sty\endcsname,\MessageBreak
+        outoruby: \ltx at space\csname ver at outoruby.sty\endcsname
+      }%
+    }}}}}}}}%
+  }%
+  \outorb at opt@parse at loop
+}
+%    \end{macrocode}
+% \begin{macro}{\outorb at opt@parse at exit}
+%    \begin{macrocode}
+\def\outorb at opt@parse at exit#1\outorb at end{%
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{\cs{outorubysetup}}
+%
+% \begin{macro}{\outorb at setup@bintr}
+% <option_2>の前進入指定の既定値。
+% \begin{macro}{\outorb at setup@aintf}
+% <option_2>の後進入指定の既定値。
+% \begin{macro}{\outorubysetup}
+% \begin{macro}{\outorb at outorubysetup}
+% #1を\cs{outoruby}の<option_2>の既定値に。
+% 前進入、後進入以外は無視し、それぞれ排他。
+%    \begin{macrocode}
+\let\outorb at setup@bintr\ltx at empty
+\let\outorb at setup@aintr\ltx at empty
+\outorb at errifdefined\outorubysetup
+\outorb at protected\def\outorubysetup#1{%
+  \begingroup
+  \outorb at opt@parse{#1}%
+  \edef\outorb at tempa{%
+    \ifx\outorb at opt@parse at bintr\ltx at empty\else
+      \def\noexpand\outorb at setup@bintr{%
+        \outorb at opt@parse at bintr
+      }%
+    \fi
+    \ifx\outorb at opt@parse at aintr\ltx at empty\else
+      \def\noexpand\outorb at setup@aintr{%
+        \outorb at opt@parse at aintr
+      }%
+    \fi
+  }%
+  \expandafter\endgroup\outorb at tempa
+}
+\let\outorb at outorubysetup\outorubysetup
+\outorubysetup{||-||}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{\cs{outoruby}のオプション処理}
+%
+% \begin{macro}{\outorb at opt@prebreak}
+% 行末形の\cs{jruby}に渡すオプション(\A[]あり)。
+% \begin{macro}{\outorb at opt@postbreak}
+% 行頭形の\cs{jruby}に渡すオプション(\A[]あり)。
+% \begin{macro}{\outorb at opt@nobreak}
+% 行中形の\cs{jruby}に渡すオプション(\A[]あり)。
+% \begin{macro}{\outorb at opt@pre}
+% <pre-space>
+% \begin{macro}{\outorb at opt@post}
+% <post-space>
+% \begin{macro}{\outorb at opt}
+% \leavevmode\par
+% \inarg1 \cs{outoruby}のオプション引数を全部まとめたもの(\A[]あり)。空もあり得る。
+%    \begin{macrocode}
+\def\outorb at opt#1{%
+  \outorb at opt@opt#1[][][][]\outorb at nil
+}
+%    \end{macrocode}
+% \begin{macro}{\outorb at err@mustempty}
+% 実際には不要。
+%    \begin{macrocode}
+\def\outorb at err@mustempty#1#2{%
+  \ltx at ifblank{#1}{}{%
+    \outorb at err{%
+      Argument of \string#2 doesn't match its definition%
+    }%
+  }%
+}%
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at opt@opt}
+% \movempar
+% \inarg2 <option_1>
+% \inarg4 <option_2>
+% \inarg6 <pre-space>
+% \inarg8 <post-space>
+%    \begin{macrocode}
+\def\outorb at opt@opt#1[#2]#3[#4]#5[#6]#7[#8]#9\outorb at nil{%
+  \outorb at err@mustempty{#1}\outoruby
+  \outorb at err@mustempty{#3}\outoruby
+  \outorb at err@mustempty{#5}\outoruby
+  \outorb at err@mustempty{#7}\outoruby
+  \def\outorb at opt@pre{#6}%
+  \def\outorb at opt@post{#8}%
+%    \end{macrocode}
+% \par オプションパース。
+%    \begin{macrocode}
+  \outorb at opt@parse{#4}%
+  \ifx\outorb at opt@parse at bintr\ltx at empty
+    \let\outorb at opt@break at bintr\outorb at setup@bintr
+  \else
+    \let\outorb at opt@break at bintr\outorb at opt@parse at bintr
+  \fi
+  \ifx\outorb at opt@parse at aintr\ltx at empty
+    \let\outorb at opt@break at aintr\outorb at setup@aintr
+  \else
+    \let\outorb at opt@break at aintr\outorb at opt@parse at aintr
+  \fi
+  \outorb at opt@parse{#2}%
+  \ifx\outorb at opt@parse at mode\ltx at empty
+%    \end{macrocode}
+% \par \verb+||+は\verb+|-|+と扱われてしまう。
+%    \begin{macrocode}
+    \def\outorb at opt@parse at mode{-}%
+  \fi
+  \edef\outorb at opt@nobreak{[#2]}%
+  \edef\outorb at opt@prebreak{[%
+    \outorb at opt@parse at bintr
+    \outorb at opt@parse at bsub
+    \outorb at opt@parse at mode
+    \outorb at opt@break at aintr
+  ]}%
+  \edef\outorb at opt@postbreak{[%
+    \outorb at opt@break at bintr
+    \outorb at opt@parse at mode
+    \outorb at opt@parse at asub
+    \outorb at opt@parse at aintr
+  ]}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\outorb at opt@ifnobreakTF}
+% 補助設定から行分割の可否を把握。
+% \inarg1 補助設定。
+%    \begin{macrocode}
+\def\outorb at opt@ifnobreakTF#1{%
+  \edef\outorb at tempa{#1}%
+  \expandafter\outorb at opt@ifnobreak#1*\outorb at nil
+}
+\def\outorb at opt@ifnobreak#1*#2\outorb at nil{%
+  \ltx at ifblank{#2}{%
+    \ltx at secondoftwo
+  }{%
+    \ltx at firstoftwo
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{本体}
+%
+% \begin{macro}{\outoruby}
+% \begin{macro}{\outorb at 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 at errifdefined\outoruby
+\outorb at protected\def\outoruby{%
+  \outorb at outorb@opt{}[]%
+}
+\let\outorb at outoruby\outoruby
+%    \end{macrocode}
+% \begin{macro}{\outorb at outorb@opt}
+% オプションを全部取得して\cs{outorb at outorb@checkv}へ(\A[]つき)。
+%    \begin{macrocode}
+\def\outorb at outorb@opt#1[#2]{%
+  \ltx at ifnextchar[{%
+    \outorb at outorb@opt{#1[{#2}]}%
+  }{%
+    \expandafter\outorb at outorb@checkv\expandafter{\ltx at gobblethree #1[{#2}]}%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at outorb@checkv}
+% 段落はじめ(垂直モード)なら途中で分割しないと信じる。
+% 段落はじめと\pxrbpkg に知らせるため特に何もせず処理丸投げ。
+%    \begin{macrocode}
+\def\outorb at outorb@checkv#1{%
+  \ifvmode
+    \begingroup
+    \outorb at opt{#1}%
+    \expandafter\outorb at outorb@vmode% \endgroup
+  \else
+    \outorb at prologue% \begingroup
+    \outorb at opt{#1}%
+    \expandafter\outorb at outorb% \endgroup (\outorb at epilogue)
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at outorb}
+% \begin{macro}{\outorb at outorb@check at kinsoku}
+% \pxrbpkg の禁則用の先読み処理をdiscretionaryに入れる前に代わりにやっておく。
+%    \begin{macrocode}
+\def\outorb at outorb#1#2{%
+  \def\outorb at outorb@tempa{%
+    \outorb at outorb@main{#1}{#2}%
+  }%
+  \ifpxrr at safe@mode
+%    \end{macrocode}
+% \par 安全モード。
+%    \begin{macrocode}
+    \expandafter\outorb at outorb@tempa
+  \else
+    \expandafter\outorb at outorb@check at kinsoku\expandafter\outorb at outorb@tempa
+  \fi
+}
+\def\outorb at outorb@check at kinsoku#1{%
+  \pxrr at abodyfalse
+  \pxrr at check@kinsoku#1%
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{メインの処理}
+%
+% \begin{macro}{\outorb at outorb@main}
+% \movempar
+% \inarg1 <body>
+% \inarg2 <ruby>
+% \par オプションは\cs{outorb at opt}で処理済み。
+%    \begin{macrocode}
+\def\outorb at outorb@main#1#2{%
+%    \end{macrocode}
+% \par 後禁則。
+%    \begin{macrocode}
+  \edef\outorb at after@penalty{\the\pxrr at cntr}%
+  \ifnum\outorb at after@penalty>\outorb at iM
+    \outorb at outorb@anobrtrue
+  \else
+%    \end{macrocode}
+% \par オプションの後補助指定による後改行禁止。
+%    \begin{macrocode}
+    \outorb at opt@ifnobreakTF\outorb at opt@parse at asub{%
+      \outorb at outorb@anobrtrue
+    }{%
+      \outorb at outorb@anobrfalse
+    }%
+  \fi
+  \ifnum\outorb at before@penalty>\outorb at iM
+    \outorb at outorb@bnobrtrue
+  \else
+    \outorb at opt@ifnobreakTF\outorb at opt@parse at bsub{%
+      \outorb at outorb@bnobrtrue
+    }{%
+      \outorb at outorb@bnobrfalse
+    }%
+  \fi
+%    \end{macrocode}
+% \par 前後に入れるグルー。
+% 補助設定によるものはここではなくdiscretionaryの中身で入れられる(伸縮はしなくなる)。
+%    \begin{macrocode}
+  \ltx at LocalAppendToMacro\outorb at outorb@pre{%
+    \hskip\outorb at before@glue\relax
+  }%
+  \expandafter\ltx at LocalAppendToMacro\expandafter\outorb at outorb@pre\expandafter{%
+    \outorb at opt@pre
+  }%
+  \expandafter\ltx at LocalAppendToMacro\expandafter\outorb at outorb@post\expandafter{%
+    \outorb at opt@post
+  }%
+%    \end{macrocode}
+% \par 引数処理。
+%    \begin{macrocode}
+  \pxrr at decompbar{#1}%
+  \let\outorb at body@list\pxrr at res
+  \edef\outorb at body@count{\the\pxrr at cntr}%
+  \pxrr at decompbar{#2}%
+  \let\outorb at ruby@list\pxrr at res
+  \edef\outorb at ruby@count{\the\pxrr at cntr}%
+  \ifpxrr at safe@mode
+%    \end{macrocode}
+% \par 安全モード。
+%    \begin{macrocode}
+    \pxrr at unite@group\outorb at body@list
+    \def\outorb at body@count{1}%
+    \pxrr at unite@group\outorb at ruby@list
+    \def\outorb at ruby@count{1}%
+  \fi
+  \ifnum\outorb at body@count>\ltx at one
+%    \end{macrocode}
+% \par 可動グループルビ。
+% \pxrbpkg 未実装だがひとまず熟語ルビと同じ扱いにする。
+%    \begin{macrocode}
+    \ifnum\outorb at body@count=\outorb at ruby@count\relax
+      \outorb at outorb@mj{#1}{#2}%
+    \else
+      \outorb at err{%
+        \string\outoruby\ltx at space group count mismatch (\outorb at body@count <> \outorb at ruby@count)%
+      }%
+    \fi
+  \else
+%    \end{macrocode}
+% \par <body>が\verb+|+で区切られていない場合。
+% グループ単位に分割。
+%    \begin{macrocode}
+    \ifpxrr at safe@mode\else
+      \pxrr at decompose{#1}%
+      \ifnum\outorb at ruby@count=\pxrr at cntr
+%    \end{macrocode}
+% \par 真になるのはモノルビか熟語ルビ、偽になるのはグループルビの場合。
+%    \begin{macrocode}
+        \let\outorb at body@list\pxrr at res
+        \edef\outorb at body@count{\the\pxrr at cntr}%
+      \fi
+    \fi
+    \ifnum\outorb at body@count=\ltx at one
+%    \end{macrocode}
+% \par グループルビとみなせる場合。1文字のモノルビ、熟語ルビを含むが処理は同じ。
+% この場合<ruby>も単一グループからなっているので、結局モノルビと同じ処理が使える。
+%    \begin{macrocode}
+      \outorb at outorb@mj{#1}{#2}%
+    \else\ifnum\outorb at body@count=\outorb at ruby@count\relax
+%    \end{macrocode}
+% \par モノルビ、熟語ルビ。
+%    \begin{macrocode}
+      \outorb at outorb@mj{#1}{#2}%
+    \else
+      \outorb at err{%
+        \string\outoruby\ltx at space group count mismatch (\outorb at body@count <> \outorb at ruby@count)%
+      }%
+    \fi\fi
+  \fi
+  \outorb at epilogue
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\cs{discretionary}組み立て}
+%
+% \begin{macro}{\outorb at outorb@mj}
+% \cs{outorb at discretionary}の引数を実際に組み立てる。
+% \intl\outorb at boyd@list \pxrr at pre{<body_1>}\pxrr at inter{<body_2>}\ldots\pxrr at inter{<body_n>}\pxrr at post
+% \intl\outorb at boyd@list \pxrr at pre{<ruby_1>}\pxrr at inter{<ruby_2>}\ldots\pxrr at inter{<ruby_n>}\pxrr at post
+% \par 引数は<no-break>用。\cs{pxrr at post}で使われる。
+% \inarg1 <body>
+% \inarg2 <ruby>
+%    \begin{macrocode}
+\def\outorb at outorb@mj{%
+  \expandafter\outorb at pxrr@product at list\expandafter{\outorb at body@list}%
+  \expandafter\outorb at pxrr@pair at list\expandafter{\outorb at res}%
+  \let\outorb at body@product at list\outorb at res
+  \expandafter\outorb at pxrr@product at list\expandafter{\outorb at ruby@list}%
+  \expandafter\outorb at pxrr@pair at list\expandafter{\outorb at res}%
+  \let\outorb at ruby@product at list\outorb at res
+  \pxrr at zip@list\outorb at body@product at list\outorb at ruby@product at list
+%    \end{macrocode}
+% \result\pxrr at res
+% \pxrr at pre{\ttend2
+%   {\pxrr at post}\ttend2
+%   {\pxrr at pre{<body_1>}\pxrr at inter{<body_2>}\ldots\pxrr at inter{<body_n>}\pxrr at post}\ttend1
+% }{\ttend2
+%   {\pxrr at post}\ttend2
+%   {\pxrr at pre{<ruby_1>}\pxrr at inter{<ruby_2>}\ldots\pxrr at inter{<ruby_n>}\pxrr at post}\ttend1
+% }\pxrr at inter{\ttend2
+%   {\pxrr at pre{<body_1>}\pxrr at post}\ttend2
+%   {\pxrr at pre{<body_2>}\pxrr at inter{<body_3>}\ldots\pxrr at inter{<body_n>}\pxrr at post}\ttend1
+% }{\ttend2
+%   {\pxrr at pre{<ruby_1>}\pxrr at post}\ttend2
+%   {\pxrr at pre{<ruby_2>}\pxrr at inter{<ruby_3>}\ldots\pxrr at inter{<ruby_n>}\pxrr at post}\ttend1
+% }\ttend1
+% \vdots\\\ttindent
+% \pxrr at inter{\ttend2
+%   {\pxrr at pre{<body_1>}\pxrr at inter{<body_2>}\ldots\pxrr at inter{<body_n>}\pxrr at post}\ttend2
+%   {\pxrr at post}\ttend1
+% }{\ttend2
+%   {\pxrr at pre{<ruby_1>}\pxrr at inter{<ruby_2>}\ldots\pxrr at inter{<ruby_n>}\pxrr at post}\ttend2
+%   {\pxrr at post}\ttend1
+% }\pxrr at post
+%    \begin{macrocode}
+  \let\pxrr at pre\outorb at outorb@mj at pre
+  \let\pxrr at inter\outorb at outorb@mj at inter
+  \let\pxrr at post\outorb at outorb@mj at post
+%    \end{macrocode}
+% \result\outorb at outorb@disc at list
+% \cs{outorb at discretionary}の第一引数。
+%    \begin{macrocode}
+  \let\outorb at outorb@disc at list\ltx at empty
+  \pxrr at res
+}
+%    \end{macrocode}
+% \begin{macro}{\ifoutorb at outorb@bnobr}
+% \begin{macro}{\ifouotrb at outorb@anobr}
+% 前後での分割禁止の有無。
+%    \begin{macrocode}
+\ltx at newif\ifoutorb at outorb@bnobr% before no break
+\ltx at newif\ifoutorb at outorb@anobr% after no break
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\outorb at outorb@mj at pre}
+%    \begin{macrocode}
+\def\outorb at outorb@mj at pre#1#2{%
+  \ifoutorb at outorb@bnobr
+%    \end{macrocode}
+% \par 前分割禁止。
+% ここで分割可能なパターンを入れない。
+%    \begin{macrocode}
+  \else
+    \outorb at outorb@mj at makeruby#1#2%
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at outorb@mj at inter}
+%    \begin{macrocode}
+\def\outorb at outorb@mj at inter#1#2{%
+  \pxrr at if@last{%
+    \ifoutorb at outorb@anobr
+%    \end{macrocode}
+% \par 後分割禁止。
+%    \begin{macrocode}
+    \else
+      \outorb at outorb@mj at makeruby#1#2%
+    \fi
+  }{%
+    \outorb at outorb@mj at makeruby#1#2%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at outorb@mj at makeruby}
+% 1つの<pre-break_m>と<post-break_m>のパターンを作る。
+% \cs{ifoutorb at bnobr}の場合$m=k$、そうでなければ$m=k+1$。
+% \inarg1 \pxrr at pre{<body_1>}\pxrr at inter{<body_2>}\ldots \pxrr at inter{<body_k>}\pxrr at post
+% \inarg2 \pxrr at pre{<body_{k+1}>}\pxrr at inter{<body_{k+2}>}\ldots \pxrr at inter{<body_n>}\pxrr at post
+% \inarg3 \pxrr at pre{<ruby_1>}\pxrr at inter{<ruby_2>}\ldots \pxrr at inter{<ruby_k>}\pxrr at post
+% \inarg4 \pxrr at pre{<ruby_{k+1}>}\pxrr at inter{<ruby_{k+2}>}\ldots \pxrr at inter{<ruby_n>}\pxrr at post
+% \par #1と#3から<pre-break_m>、#2と#4から<post-break_m>。
+%    \begin{macrocode}
+\def\outorb at outorb@mj at makeruby#1#2#3#4{%
+%    \end{macrocode}
+% \par \cs{pxrr at inter}リストの処理で意味変えられるので退避しておいて後で戻す。
+%    \begin{macrocode}
+  \let\outorb at outorb@mj at makeruby@pre\pxrr at pre
+  \let\outorb at outorb@mj at makeruby@inter\pxrr at inter
+  \let\outorb at outorb@mj at makeruby@post\pxrr at post
+%    \end{macrocode}
+% \par 空(単一\pxrr at post )の場合、\cs\jruby 実行せず<pre-break_m>または<post-break_m>も空。
+% ちょうどルビ全体のの前後で改行した場合。
+% \result\outorb at outorb@mj at makeruby@pre at list <pre-break_m>
+%    \begin{macrocode}
+  \outorb at pxrr@ifemptyTF{#1}{%
+    \def\outorb at outorb@mj at makeruby@pre at list{}%
+  }{%
+    \edef\outorb at outorb@mj at makeruby@pre at list{%
+      \outorb at outorb@cmd at prebreak
+    }%
+    \outorb at pxrr@join at list{}{#1}%
+    \expandafter\ltx at LocalAppendToMacro
+      \expandafter\outorb at outorb@mj at makeruby@pre at list
+      \expandafter{%
+        \expandafter{\outorb at res}%
+    }%
+    \outorb at pxrr@join at list{|}{#3}%
+    \expandafter\ltx at LocalAppendToMacro
+      \expandafter\outorb at outorb@mj at makeruby@pre at list
+      \expandafter{%
+        \expandafter{\outorb at res}%
+    }%
+  }%
+  \outorb at pxrr@ifemptyTF{#2}{%
+    \def\outorb at outorb@mj at makeruby@post at list{}%
+  }{%
+%    \end{macrocode}
+% \result\outorb at outorb@mj at makeruby@post at list <post-break_m>
+%    \begin{macrocode}
+    \edef\outorb at outorb@mj at makeruby@post at list{%
+      \outorb at outorb@cmd at postbreak
+    }%
+    \outorb at pxrr@join at list{}{#2}%
+    \expandafter\ltx at LocalAppendToMacro
+      \expandafter\outorb at outorb@mj at makeruby@post at list
+      \expandafter{%
+        \expandafter{\outorb at res}%
+    }%
+    \outorb at pxrr@join at list{|}{#4}%
+    \expandafter\ltx at LocalAppendToMacro
+      \expandafter\outorb at outorb@mj at makeruby@post at list
+      \expandafter{%
+        \expandafter{\outorb at res}%
+    }%
+  }%
+%    \end{macrocode}
+% \par 追加。
+%    \begin{macrocode}
+  \expandafter\ltx at LocalAppendToMacro\expandafter\outorb at outorb@disc at list\expandafter{%
+    \expandafter{\outorb at outorb@mj at makeruby@pre at list}%
+  }%
+  \expandafter\ltx at LocalAppendToMacro\expandafter\outorb at outorb@disc at list\expandafter{%
+    \expandafter{\outorb at outorb@mj at makeruby@post at list}%
+  }%
+%    \end{macrocode}
+% \par 退避していたのを戻す。
+%    \begin{macrocode}
+  \let\pxrr at pre\outorb at outorb@mj at makeruby@pre
+  \let\pxrr at inter\outorb at outorb@mj at makeruby@inter
+  \let\pxrr at post\outorb at outorb@mj at makeruby@post
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at outorb@mj at post}
+% <no-break>を作り、\cs{outorb at discretionary}実行。
+% \inarg1 <body>
+% \inarg2 <ruby>
+%    \begin{macrocode}
+\def\outorb at outorb@mj at post#1#2{%
+  \def\outorb at res{%
+    \outorb at discretionary
+  }%
+  \expandafter\ltx at LocalAppendToMacro\expandafter\outorb at res\expandafter{%
+    \expandafter{\outorb at outorb@disc at list}%
+  }%
+  \edef\outorb at outorb@mj at makeruby@nobreak{%
+    \outorb at outorb@cmd at nobreak
+  }%
+  \ltx at LocalAppendToMacro\outorb at outorb@mj at makeruby@nobreak{%
+    {#1}{#2}%
+  }%
+  \expandafter\ltx at LocalAppendToMacro\expandafter\outorb at res\expandafter{%
+    \expandafter{\outorb at outorb@mj at makeruby@nobreak}%
+  }%
+%    \end{macrocode}
+% \par \cs{outorb at discretionary}実行。
+%    \begin{macrocode}
+  \def\outorb at disccommand{\noexpand\outoruby}%
+  \outorb at res
+}
+%    \end{macrocode}
+%
+% \subsubsection{実際にルビを組み立てるコマンド}
+%
+% \begin{macro}{\outorb at outorb@cmd}
+% \begin{macro}{\outorb at outorb@cmd at prebreak}
+% \begin{macro}{\outorb at outorb@cmd at postbreak}
+% \begin{macro}{\outorb at outorb@cmd at nobreak}
+% \cs{edef}中で呼ばれる。
+% \par\noindent\texttt{#1}: <body>(行分割位置に応じて調整済み)
+% \par\noindent\texttt{#2}: <ruby>(行分割位置に応じて調整済み)
+% \par これを使って実際にルビを組む。
+%    \begin{macrocode}
+\def\outorb at outorb@cmd{\noexpand\outorb at outorb@cmd at jruby}
+\def\outorb at outorb@cmd at prebreak{%
+  \outorb at outorb@cmd
+    \noexpand\outorb at outorb@pre
+    {}%
+    \outorb at opt@prebreak
+}
+\def\outorb at outorb@cmd at postbreak{%
+  \outorb at outorb@cmd
+    {}%
+    \noexpand\outorb at outorb@post
+    \outorb at opt@postbreak
+}
+\def\outorb at outorb@cmd at nobreak{%
+  \outorb at outorb@cmd
+    \noexpand\outorb at outorb@pre
+    \noexpand\outorb at outorb@post
+    \outorb at opt@nobreak
+}
+%    \end{macrocode}
+% \begin{macro}{\outorb at outorb@cmd at jruby}
+% This can't happen対策で\cs{hbox}に入れる。
+%    \begin{macrocode}
+\def\outorb at outorb@cmd at jruby#1#2[#3]#4#5{%
+  \hbox{%
+    #1%
+    \outorb at 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 at outorb@cmd at vmode}
+% 垂直モードだった場合の実際のルビの組み立て。
+%    \begin{macrocode}
+\def\outorb at outorb@cmd at vmode{%
+  \noexpand\outorb at cmd@jruby\outorb at opt@nobreak
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at cmd@jruby}
+% ルビを組む処理を投げる命令
+%    \begin{macrocode}
+\def\outorb at cmd@jruby{\jruby}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\outorb at outorb@vmode}
+% 垂直モードの場合。
+%    \begin{macrocode}
+\def\outorb at outorb@vmode{%
+  \ltx at LocToksA\expandafter{\outorb at opt@pre}%
+  \ltx at LocToksB\expandafter{\outorb at opt@post}%
+  \edef\outorb at tempa##1##2{%
+    \the\ltx at LocToksA
+    \outorb at outorb@cmd at vmode{##1}{##2}%
+    \the\ltx at LocToksB
+  }%
+  \expandafter\endgroup\outorb at tempa
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{プロローグ}
+%
+% \begin{macro}{\outorb at prologue}
+% 垂直モードでない場合最初に実行される。
+% 前側の空白を退避して<pre-space>に持っていく。
+% ペナルティも退避して行分割の可否を判断した上、ここでの分割を禁止する。
+%    \begin{macrocode}
+\def\outorb at prologue{%
+  \begingroup
+  \rubynousejghost
+  \outorb at hyphen@check
+%    \end{macrocode}
+% \begin{macro}{\outorb at outorb@pre}
+% \begin{macro}{\outorb at outorb@post}
+% 前後のグルー(伸縮はしない)などを入れておく用。
+%    \begin{macrocode}
+  \let\outorb at outorb@pre\ltx at empty
+  \let\outorb at outorb@post\ltx at empty
+  \outorb at bgluepen
+%    \end{macrocode}
+% \par \cs\outorb at discretionary で改行するため、ここで改行してはいけない。
+%    \begin{macrocode}
+  \penalty\outorb at MM
+%    \end{macrocode}
+% \par This can't happen対策。
+%    \begin{macrocode}
+  \hbox{}\penalty\outorb at MM
+}
+%    \end{macrocode}
+% \begin{macro}{\outorb at bgluepen}
+% グルーとペナルティを退避。
+% \result\outorb at before@glue 前側のグルー合計。
+% \result\outorb at before@penalty 前側のペナルティ合計。
+%    \begin{macrocode}
+\def\outorb at bgluepen{%
+%    \end{macrocode}
+% \result\ltx at LocSkipA グルー(処理途中)。
+%    \begin{macrocode}
+  \ltx at LocSkipA0pt\relax
+%    \end{macrocode}
+% \result\ltx at LocSkipA ペナルティ(処理途中)。
+%    \begin{macrocode}
+  \pxrr at cnta=\ltx at zero
+  \outorb at bgluepen@do
+  \edef\outorb at before@glue{\the\ltx at LocSkipA}%
+  \edef\outorb at before@penalty{\the\pxrr at cnta}%
+}
+%    \end{macrocode}
+% グルーとペナルティがある間それを退避して削除する。
+%    \begin{macrocode}
+\pxrr at ifprimitive\lastnodetype{% e-TeX
+  \def\outorb at 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 at LocSkipA\lastskip
+      \unskip
+      \expandafter\outorb at bgluepen@do
+    \else\ifnum\lastnodetype=13
+      \advance\pxrr at cnta\lastpenalty
+      \unpenalty
+      \expandafter\expandafter\expandafter\outorb at bgluepen@do
+    \fi\fi
+  }%
+}{% non e-TeX
+  \def\outorb at bgluepen@do{%
+    \outorb at bgluepen@remove
+    \outorb at bgluepen@remove
+    \outorb at bgluepen@remove
+    \ifnum\lastskip=\ltx at zero\else
+      \expandafter\outorb at bgluepen@do
+    \else\ifnum\lastpenalty=\ltx at zero\else
+      \expandafter\expandafter\expandafter\outorb at bgluepen@do
+    \fi\fi
+  }%
+}
+%    \end{macrocode}
+% \par 0じゃない場合だけ追加。どっちにしろ削除するので意味は特にないような。
+%    \begin{macrocode}
+\def\outorb at bgluepen@remove{%
+  \ifnum\lastskip=\ltx at zero\else
+    \advance\ltx at LocSkipA\lastskip
+  \fi
+  \unskip
+  \ifnum\lastpenalty=\ltx at zero\else
+    \advance\pxrr at cnta\lastpenalty
+  \fi
+  \unpenalty
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{エピローグ}
+%
+% \begin{macro}{\outorb at epilogue}
+% 終了時の処理。
+%    \begin{macrocode}
+\def\outorb at epilogue{%
+%    \end{macrocode}
+% \par \cs\outorb at discretionary で改行するため、ここで改行してはいけない。
+%    \begin{macrocode}
+  \penalty\outorb at MM
+%    \end{macrocode}
+% \par This can't happen対策。
+%    \begin{macrocode}
+  \hbox{}\penalty\outorb at MM
+%    \end{macrocode}
+% \par この後にユーザがペナルティやグルーを置いた場合、\cs\outorb at discretionary の直後で改行が発生し得るのでまずいことになる。
+% ペナルティは無理だけど空白はなるべく無視するようにする。
+%    \begin{macrocode}
+  \endgroup
+  \pxrr at inhibitglue
+  \ignorespaces
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{ハイフネーションペナルティ}
+%
+% \begin{macro}{\outorb at hyphen@check}
+% 各\cs{outoruby}でハイフネーションペナルティをチェックする。
+%    \begin{macrocode}
+\def\outorb at hyphen@check{%
+%    \end{macrocode}
+% \par この値は要検討。
+%    \begin{macrocode}
+  \ifnum\hyphenpenalty>\outorb at iM
+    \outorb at hyphen@warn at nobreak
+%    \end{macrocode}
+% \par この値も。
+%    \begin{macrocode}
+  \else\ifnum\hyphenpenalty>100
+    \outorb at hyphen@warn at maynotbreak
+  \fi\fi
+}
+%    \end{macrocode}
+% \begin{macro}{\outorb at hyphen@warn at nobreak}
+% \begin{macro}{\outorb at warn@maynotbreak}
+% ハイフネーションペナルティが大きい場合に一度だけ警告を出す。
+%    \begin{macrocode}
+\def\outorb at hyphen@warn at nobreak{%
+  \global\let\outorb at hyphen@warn at nobreak\relax
+  \outorb at warn{%
+    The \string\hyphenpenalty\ltx at space value \the\hyphenpenalty\ltx at space too large.\MessageBreak
+    \string\outoruby will not break.\MessageBreak
+    Using \string\outorubyhyphenbreakable\ltx at space may help it improve%
+  }%
+}
+\def\outorb at hyphen@warn at maynotbreak{%
+  \global\let\outorb at hyphen@warn at maynotbreak\relax
+  \outorb at warn{%
+    The \string\hyphenpenalty\ltx at space value \the\hyphenpenalty\ltx at space too large.\MessageBreak
+    \string\outoruby may not break.\MessageBreak
+    Using \string\outorubyhyphenbreakable\ltx at space may help it improve%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\outorubyhyphenbreakable}
+% \begin{macro}{\outorb at outorubyhyphenbreakable}
+% \@cs\outorubyhyphenbreakable[<n>]
+% \par <n>はハイフネーションでの分割のしにくさ。
+% 0だとペナルティ0で、4だと最小限(9999)。
+% ただしより大きい値にペナルティを更新することはない。
+% \par どんな値にすべきかはよくわからない。
+%    \begin{macrocode}
+\outorb at errifdefined\outorubyhyphenbreakable
+\outorb at protected\def\outorubyhyphenbreakable{
+  \ltx at ifnextchar[{\outorb at hyphenbreakable}{\outorb at hyphenbreakable[0]}%
+}
+\let\outorb at 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 at hyphenbreakable[#1]{%
+  \outorb at hyphenpenalty@min\hyphenpenalty{\outorb at getpen{#1}}%
+  \outorb at hyphenpenalty@min\doublehyphendemerits{\outorb at getpen{#1}}%
+  \outorb at hyphenpenalty@min\finalhyphendemerits{\outorb at getpen{#1}}%
+}
+%    \end{macrocode}
+% \par より小さくなる場合だけペナルティを更新。
+%    \begin{macrocode}
+\def\outorb at hyphenpenalty@min#1#2{%
+  \ifnum#1>#2\relax
+    #1=#2\relax
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{\pkg{hyperref}対策}
+%
+% \begin{macro}{\outorb at 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 at exp@opt#1#2#{%
+  \outorb at exp@opt at loop{#1}{}#2[\outorb at nil}
+\def\outorb at exp@opt at loop#1#2#3[#4\outorb at nil{%
+%    \end{macrocode}
+% \par \verb+#2#{+で取得したので、このパターンマッチで最外\A{}が外れる心配はない。
+%    \begin{macrocode}
+  \ltx at ifempty{#4}{%
+%    \end{macrocode}
+% \par \verb+[+含まれてない場合は終了。
+%    \begin{macrocode}
+    #1{#2#3}%
+  }{%
+    \outorb at exp@opt at chop@open{#1}{#2#3[}#4\outorb at nil
+  }%
+}
+\def\outorb at exp@opt at chop@open#1#2#3[\outorb at nil{%
+  \outorb at exp@opt at bracket{#1}{#2}#3]\outorb at nil
+}
+%    \end{macrocode}
+% \par \verb+[+があったので\verb+]+があるか調べる。
+%    \begin{macrocode}
+\def\outorb at exp@opt at bracket#1#2#3]#4\outorb at nil{%
+  \ltx at ifempty{#4}{%
+%    \end{macrocode}
+% \par \verb+]+足りない。
+% \A[]中に\A{}があったということなのでそれを考慮して\verb+]+まで取ってくる。
+% ここだけ最外\A{}が外れないよう考慮する必要あり。
+%    \begin{macrocode}
+    \outorb at exp@opt at brace{#1}{#2#3}.%
+  }{%
+    \outorb at exp@opt at chop@close{#1}{#2#3]}#4\outorb at nil
+  }%
+}
+\def\outorb at exp@opt at brace#1#2#3]{%
+  \expandafter\outorb at exp@opt at brace@next\expandafter{\ltx at gobble #3]}{#1}{#2}%
+}
+\def\outorb at exp@opt at brace@next#1#2#3#4#{%
+  \outorb at exp@opt at loop{#2}{#3#1}#4[\outorb at nil
+}
+\def\outorb at exp@opt at chop@close#1#2#3]\outorb at nil{%
+  \outorb at exp@opt at loop{#1}{#2}#3[\outorb at nil
+}
+%    \end{macrocode}
+% \end{macro}
+% \par \pkg{hyperref}中で使われた場合は親文字のみ出力。
+% \par \cs{ltx at GlobalAppendToMacro}等はマクロが未定義の場合空で初期化する。
+%    \begin{macrocode}
+\ltx at GlobalAppendToMacro\pdfstringdefPreHook{%
+  \def\outoruby{%
+    \outorb at exp@opt\ltx at secondofthree
+  }%
+  \let\outorb at 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}
+%


Property changes on: branches/branch2024.final/Master/texmf-dist/source/latex/outoruby/outoruby.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: branches/branch2024.final/Master/texmf-dist/tex/latex/outoruby/outoruby.sty
===================================================================
--- branches/branch2024.final/Master/texmf-dist/tex/latex/outoruby/outoruby.sty	                        (rev 0)
+++ branches/branch2024.final/Master/texmf-dist/tex/latex/outoruby/outoruby.sty	2025-03-02 21:43:10 UTC (rev 74395)
@@ -0,0 +1,907 @@
+%%
+%% This is file `outoruby.sty', generated on <2025/3/2> 
+%% with the docstrip utility (v2.6b).
+%%
+%% The original source files were:
+%%
+%% outoruby.dtx  (with options: `pkg')
+%% 
+%% 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
+%%
+%% \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         \~}
+%%
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{outoruby}
+  [2025/03/02 v0.0.0 ]
+\def\outorb at pkgname{outoruby}
+\def\outorb at err#1{%
+  \@PackageError\outorb at pkgname{#1}\@ehc
+}
+\def\outorb at warn{%
+  \@PackageWarning\outorb at pkgname
+}
+\def\outorb at warn@noln{%
+  \@PackageWarningNoLine\outorb at pkgname
+}
+\RequirePackage{pxrubrica}[2011/07/23]
+\expandafter\ifx\csname ifpxrr at safe@mode\endcsname\relax
+  \expandafter\let\csname ifpxrr at safe@mode\expandafter\endcsname\csname iffalse\endcsname
+\fi
+\expandafter\ifx\csname pxrr at unite@group\endcsname\relax
+  \def\pxrr at unite@group#1{%
+    \def\pxrr at inter##1{%
+      \ltx at LocalAppendToMacro#1{##1}%
+    }%
+    \def\pxrr at pre{%
+      \let#1\ltx at empty
+      \pxrr at inter
+    }%
+    \def\pxrr at post{%
+      \expandafter\def\expandafter#1\expandafter{%
+        \expandafter\pxrr at pre\expandafter{#1}\pxrr at post
+      }%
+    }%
+    #1%
+  }
+\fi
+\expandafter\ifx\csname pxrr at ifprimitive\endcsname\relax
+  \def\pxrr at ifprimitive#1#2#3{#3}
+\fi
+\expandafter\ifx\csname pxrr at inhibitglue\endcsname\relax
+  \let\pxrr at inhibitglue\relax
+\fi
+\RequirePackage{ltxcmds}[2011/08/22]% \ltx at LocalPrependToMacro
+\RequirePackage{infwarerr}
+\newcount\outorb at disc@count
+\newbox\outorb at disc@box
+\def\outorb at thepage{\thepage}
+\def\outorb at aux@write#1{%
+  \protected at write\@auxout{}{#1}%
+}
+\def\outorb at aux@write at immediate{%
+  \immediate\write\@auxout
+}
+\def\outorb at AtBeginDocument{%
+  \AtBeginDocument
+}
+\def\outorb at AtEndDocument{%
+  \AtEndDocument
+}
+\def\outorb at labelchanged{%
+  \@tempswatrue
+}
+\def\outorb at aux@write at providecommand#1{%
+  \string\providecommand\string#1%
+}
+\def\outorb at errifdefined#1{%
+  \newcommand#1{}%
+}
+\mathchardef\outorb at MM=20000
+\mathchardef\outorb at iM=9999
+\def\outorb at getpen{\@getpen}
+\pxrr at ifprimitive\protected{% e-TeX
+  \def\outorb at protected#1#2{%
+    \protected#1#2%
+  }%
+}{% non e-TeX
+  \def\outorb at protected#1#2{%
+    \def\outorb at protected@tempa{#2}%
+    \afterassignment\outorb at protected@makerobust
+    #1#2%
+  }%
+  \def\outorb at protected@makerobust{%
+    \begingroup
+      \escapechar=\ltx at minusone
+      \edef\outorb at tempa{%
+        \def\noexpand\outorb at tempa{%
+          \expandafter\string\outorb at protected@tempa
+        }%
+      }%
+    \expandafter\endgroup\outorb at tempa
+    \expandafter\let\csname
+      \outorb at tempa\ltx at space\expandafter\endcsname
+      \csname \outorb at tempa\endcsname
+    \expandafter\edef\csname \outorb at tempa\expandafter\endcsname{%
+      \noexpand\protect
+      \expandafter\noexpand\csname \outorb at tempa\ltx at space\endcsname
+    }%
+  }%
+}
+\outorb at protected\def\outorb at discretionary#1#2{%
+  \begingroup
+  \setbox\outorb at disc@box=\hbox{#2}%
+  \ltx at ifblank{#1}{%
+    \unhbox\outorb at disc@box
+    \endgroup
+  }{%
+    \expandafter\expandafter\expandafter\pxrr at decompose\expandafter\expandafter\expandafter{%
+      \ltx at zapspace{#1}%
+    }%
+    \let\pxrr at inter\outorb at disc@inter
+    \let\pxrr at pre\pxrr at inter
+    \let\pxrr at post\outorb at disc@post
+    \pxrr at res
+  }%
+}
+\def\outorb at disc@post{%
+  \global\advance\outorb at disc@count\ltx at one
+  \endgroup
+}
+\def\outorb at disc@inter#1#2#3{%
+  \ifx\pxrr at inter#2\else
+    \outorb at err{%
+      Extra pre-break, or forgotten post-break in \string\outorb at discretionary
+    }%
+  \fi
+  \pxrr at if@last{%
+    \discretionary{%
+      \outorb at disc@break at pre
+      #1%
+    }{%
+      #3%
+    }{%
+      \outorb at disc@nobreak
+      \outorb at disc@ifbreakTF{\kern\wd\outorb at disc@box}{\unhbox\outorb at disc@box}}%
+  }{%
+    \discretionary{%
+      \outorb at disc@break at pre
+      #1%
+    }{%
+      #3\outorb at disc@break at post
+    }{}%
+  }%
+}
+\def\outorb at disc@break at post{%
+  \hbox{\outorb at aux@write{%
+    \string\outorb at disc@break at aux{\the\outorb at disc@count}{\outorb at thepage}{\the\inputlineno}%
+      {\outorb at disccommand}%
+    \noexpand\outorb at disc@break at record{\the\outorb at disc@count}%
+  }}%
+  \kern-\wd\outorb at disc@box
+}
+\def\outorb at disc@break at record#1{%
+  \expandafter\ltx at gobble\csname outorb at disc@break at check@#1\endcsname
+}
+\def\outorb at disc@break at pre{%
+  \hbox{\outorb at aux@write{%
+    \noexpand\outorb at disc@break at check{\the\outorb at disc@count}{\the\inputlineno}%
+      {\outorb at disccommand}%
+      \expandafter\noexpand\csname outorb at disc@break at check@\the\outorb at disc@count\endcsname
+  }}%
+}
+\def\outorb at disccommand{\noexpand\outorb at discretionary}
+\def\outorb at disc@break at check#1#2#3#4{%
+  \ifx#4\relax
+    \expandafter\outorb at disc@break at check@error\expandafter{%
+      \romannumeral-`0\outorb at thepage}{#1}{#2}{#3}%
+  \fi
+}
+\def\outorb at tempa#1{%
+  \def\outorb at disc@break at check@error##1##2##3##4{%
+    \expandafter\expandafter\expandafter\ltx at carzero\ltx at firstofone{%
+      #1##4at line ##3 break twice in p.##1. (##2)}%
+    \@nil
+  }%
+}
+\ltx at LocalExpandAfter\outorb at tempa\csname
+  outoruby.sty Error:\endcsname
+\def\outorb at disc@nobreak{%
+  \hbox{\outorb at aux@write{%
+    \string\outorb at disc@nobreak at aux{\the\outorb at disc@count}{\outorb at thepage}{\the\inputlineno}%
+      {\outorb at disccommand}%
+  }}%
+}
+\def\outorb at disc@ifbreakTF{%
+  \expandafter\ifx\csname outorb at disc@break@\the\outorb at disc@count\endcsname\relax
+    \expandafter\ltx at secondoftwo
+  \else
+    \expandafter\ltx at firstoftwo
+  \fi
+}
+\def\outorb at disc@break at aux#1#2#3#4{%
+  \expandafter\ifx\csname outorb at disc@break@#1\endcsname\relax
+    \global\expandafter\def\csname outorb at disc@break@#1\endcsname{}%
+  \else
+    \begingroup
+    \ltx at LocToksA{#4}%
+    \outorb at warn@noln{%
+      \the\ltx at LocToksA at page #2 line #3 broke twice at last typeset.\MessageBreak
+      The result may be incorrect%
+    }%
+    \endgroup
+  \fi
+}
+\def\outorb at disc@nobreak at aux#1#2#3#4{%
+}
+\outorb at AtBeginDocument{%
+  \outorb at aux@write at immediate{%
+    \outorb at aux@write at providecommand\outorb at disc@break at aux[4]{}%
+    \outorb at aux@write at providecommand\outorb at disc@nobreak at aux[4]{}%
+  }%
+}
+\outorb at AtEndDocument{%
+  \def\outorb at disc@break at aux#1#2#3#4{%
+    \expandafter\ifx\csname outorb at disc@break@#1\endcsname\relax
+      \outorb at labelchanged
+    \fi
+    \expandafter\def\csname outorb at disc@break at enddoc@#1\endcsname{}%
+  }%
+  \def\outorb at disc@nobreak at aux#1#2#3#4{%
+    \expandafter\ifx\csname outorb at disc@break@#1\endcsname\relax\else% break last time
+      \expandafter\ifx\csname outorb at disc@break at enddoc@#1\endcsname\relax% no break current time
+        \outorb at labelchanged
+      \fi
+    \fi
+  }%
+}
+\def\outorb at pxrr@reverse at list#1{%
+  \let\outorb at res\ltx at empty
+  \def\pxrr at pre##1{%
+    \ltx at LocalPrependToMacro\outorb at res{%
+      {##1}\pxrr at post
+    }%
+  }%
+  \def\pxrr at inter##1{%
+    \ltx at LocalPrependToMacro\outorb at res{%
+      {##1}\pxrr at inter
+    }%
+  }%
+  \def\pxrr at post{%
+    \ltx at LocalPrependToMacro\outorb at res{%
+      \pxrr at pre
+    }%
+  }%
+  #1%
+}
+\def\outorb at pxrr@step at list#1{%
+  \def\outorb at res{\pxrr at pre{\pxrr at post}}%
+  \def\pxrr at pre##1##2{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at inter{%
+        \pxrr at pre{##1}\pxrr at post
+      }%
+    }%
+    ##2{\pxrr at pre{##1}}%
+  }%
+  \def\pxrr at inter##1##2##3{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at inter{%
+        ##1\pxrr at inter{##2}\pxrr at post
+      }%
+    }%
+    ##3{##1\pxrr at inter{##2}}%
+  }%
+  \def\pxrr at post##1{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at post
+    }%
+  }%
+  #1%
+}
+\def\outorb at pxrr@rstep at list#1{%
+  \def\outorb at res{\pxrr at pre{\pxrr at post}}%
+  \def\pxrr at pre##1##2{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at inter{%
+        \pxrr at pre{##1}\pxrr at post
+      }%
+    }%
+    ##2{\pxrr at inter{##1}\pxrr at post}%
+  }%
+  \def\pxrr at inter##1##2##3{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at inter{%
+        \pxrr at pre{##2}##1%
+      }%
+    }%
+    ##3{\pxrr at inter{##2}##1}%
+  }%
+  \def\pxrr at post##1{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at post
+    }%
+  }%
+  #1%
+}
+\def\outorb at pxrr@product at list#1{%
+  \outorb at pxrr@step at list{#1}%
+  \let\outorb at pxrr@product at list@tempa\outorb at res
+  \outorb at pxrr@reverse at list{#1}%
+  \expandafter\outorb at pxrr@rstep at list\expandafter{\outorb at res}%
+  \expandafter\outorb at pxrr@reverse at list\expandafter{\outorb at res}%
+  \pxrr at zip@list\outorb at pxrr@product at list@tempa\outorb at res
+  \let\outorb at res\pxrr at res
+}
+\def\outorb at pxrr@join at list#1#2{%
+  \let\outorb at res\ltx at empty
+  \def\pxrr at inter##1{%
+    \pxrr at if@last{%
+      \ltx at LocalAppendToMacro\outorb at res{##1}%
+    }{%
+      \ltx at LocalAppendToMacro\outorb at res{##1#1}%
+    }%
+  }%
+  \let\pxrr at pre\pxrr at inter
+  \def\pxrr at post{\ltx at gobble\pxrr at post}%
+  #2%
+}
+\def\outorb at pxrr@pair at list#1{%
+  \let\outorb at res\ltx at empty
+  \def\pxrr at pre##1##2{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at pre{{##1}{##2}}%
+    }%
+  }%
+  \def\pxrr at inter##1##2{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at inter{{##1}{##2}}%
+    }%
+  }%
+  \def\pxrr at post{%
+    \ltx at LocalAppendToMacro\outorb at res{%
+      \pxrr at post
+    }%
+  }%
+  #1%
+}
+\def\outorb at pxrr@ifemptyTF#1{%
+  \begingroup
+  \def\outorb at tempa{#1}%
+  \def\outorb at tempb{\pxrr at post}%
+  \expandafter\endgroup\ifx\outorb at tempa\outorb at tempb
+    \expandafter\ltx at firstoftwo
+  \else
+    \expandafter\ltx at secondoftwo
+  \fi
+}
+\def\outorb at ifstreqTF#1#2{%
+  \begingroup
+  \edef\outorb at tempa{#1}%
+  \edef\outorb at tempb{#2}%
+  \expandafter\endgroup\ifx\outorb at tempa\outorb at tempb
+    \expandafter\ltx at firstoftwo
+  \else
+    \expandafter\ltx at secondoftwo
+  \fi
+}
+\def\outorb at opt@parse#1{%
+  \outorb at ifstreqTF{#1}{||}{%
+    \def\outorb at opt@opt{|-|}%
+  }{%
+    \edef\outorb at opt@opt{#1}%
+  }%
+  \let\outorb at opt@parse at bintr\ltx at empty
+  \let\outorb at opt@parse at bsub\ltx at empty
+  \let\outorb at opt@parse at mode\ltx at empty
+  \let\outorb at opt@parse at asub\ltx at empty
+  \let\outorb at opt@parse at aintr\ltx at empty
+  \def\outorb at po@FS{bi}%
+  \expandafter\outorb at opt@parse at loop\outorb at opt@opt @\outorb at end
+}
+\def\outorb at opt@parse at loop#1{%
+  \if#1@%
+    \expandafter\outorb at opt@parse at exit
+  \fi
+  \ltx at ifundefined{pxrr at po@C@#1}{%
+    \outorb at err{%
+      Unexpected letter `#1' found%
+    }%
+  }{%
+    \expandafter\let\expandafter\outorb at po@FS\csname
+      pxrr at po@TR@\outorb at po@FS @\csname pxrr at po@C@#1\endcsname\endcsname
+    \ifx\outorb at po@FS\relax
+      \outorb at err{%
+        Unexpected letter `#1' found%
+      }%
+    \fi
+    \outorb at ifstreqTF{\outorb at po@FS}{bi}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at bintr{#1}%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{bb}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at bintr{#1}%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{bs}{%
+      \outorb at ifstreqTF{\csname pxrr at po@C@#1\endcsname}{S}{%
+        \ltx at LocalAppendToMacro\outorb at opt@parse at bsub{#1}%
+      }{%
+        \ltx at LocalAppendToMacro\outorb at opt@parse at bintr{#1}%
+      }%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{mi}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at mode{#1}%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{as}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at asub{#1}%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{ai}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at asub{#1}%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{ab}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at aintr{#1}%
+    }{\outorb at ifstreqTF{\outorb at po@FS}{fi}{%
+      \ltx at LocalAppendToMacro\outorb at opt@parse at aintr{#1}%
+    }{%
+      \outorb at err{%
+        This can happen, may be a bug.\MessageBreak
+        (\outorb at po@FS)\MessageBreak
+        pxrubrica: \csname ver at pxrubrica.sty\endcsname,\MessageBreak
+        outoruby: \ltx at space\csname ver at outoruby.sty\endcsname
+      }%
+    }}}}}}}}%
+  }%
+  \outorb at opt@parse at loop
+}
+\def\outorb at opt@parse at exit#1\outorb at end{%
+}
+\let\outorb at setup@bintr\ltx at empty
+\let\outorb at setup@aintr\ltx at empty
+\outorb at errifdefined\outorubysetup
+\outorb at protected\def\outorubysetup#1{%
+  \begingroup
+  \outorb at opt@parse{#1}%
+  \edef\outorb at tempa{%
+    \ifx\outorb at opt@parse at bintr\ltx at empty\else
+      \def\noexpand\outorb at setup@bintr{%
+        \outorb at opt@parse at bintr
+      }%
+    \fi
+    \ifx\outorb at opt@parse at aintr\ltx at empty\else
+      \def\noexpand\outorb at setup@aintr{%
+        \outorb at opt@parse at aintr
+      }%
+    \fi
+  }%
+  \expandafter\endgroup\outorb at tempa
+}
+\let\outorb at outorubysetup\outorubysetup
+\outorubysetup{||-||}
+\def\outorb at opt#1{%
+  \outorb at opt@opt#1[][][][]\outorb at nil
+}
+\def\outorb at err@mustempty#1#2{%
+  \ltx at ifblank{#1}{}{%
+    \outorb at err{%
+      Argument of \string#2 doesn't match its definition%
+    }%
+  }%
+}%
+\def\outorb at opt@opt#1[#2]#3[#4]#5[#6]#7[#8]#9\outorb at nil{%
+  \outorb at err@mustempty{#1}\outoruby
+  \outorb at err@mustempty{#3}\outoruby
+  \outorb at err@mustempty{#5}\outoruby
+  \outorb at err@mustempty{#7}\outoruby
+  \def\outorb at opt@pre{#6}%
+  \def\outorb at opt@post{#8}%
+  \outorb at opt@parse{#4}%
+  \ifx\outorb at opt@parse at bintr\ltx at empty
+    \let\outorb at opt@break at bintr\outorb at setup@bintr
+  \else
+    \let\outorb at opt@break at bintr\outorb at opt@parse at bintr
+  \fi
+  \ifx\outorb at opt@parse at aintr\ltx at empty
+    \let\outorb at opt@break at aintr\outorb at setup@aintr
+  \else
+    \let\outorb at opt@break at aintr\outorb at opt@parse at aintr
+  \fi
+  \outorb at opt@parse{#2}%
+  \ifx\outorb at opt@parse at mode\ltx at empty
+    \def\outorb at opt@parse at mode{-}%
+  \fi
+  \edef\outorb at opt@nobreak{[#2]}%
+  \edef\outorb at opt@prebreak{[%
+    \outorb at opt@parse at bintr
+    \outorb at opt@parse at bsub
+    \outorb at opt@parse at mode
+    \outorb at opt@break at aintr
+  ]}%
+  \edef\outorb at opt@postbreak{[%
+    \outorb at opt@break at bintr
+    \outorb at opt@parse at mode
+    \outorb at opt@parse at asub
+    \outorb at opt@parse at aintr
+  ]}%
+}
+\def\outorb at opt@ifnobreakTF#1{%
+  \edef\outorb at tempa{#1}%
+  \expandafter\outorb at opt@ifnobreak#1*\outorb at nil
+}
+\def\outorb at opt@ifnobreak#1*#2\outorb at nil{%
+  \ltx at ifblank{#2}{%
+    \ltx at secondoftwo
+  }{%
+    \ltx at firstoftwo
+  }%
+}
+\outorb at errifdefined\outoruby
+\outorb at protected\def\outoruby{%
+  \outorb at outorb@opt{}[]%
+}
+\let\outorb at outoruby\outoruby
+\def\outorb at outorb@opt#1[#2]{%
+  \ltx at ifnextchar[{%
+    \outorb at outorb@opt{#1[{#2}]}%
+  }{%
+    \expandafter\outorb at outorb@checkv\expandafter{\ltx at gobblethree #1[{#2}]}%
+  }%
+}
+\def\outorb at outorb@checkv#1{%
+  \ifvmode
+    \begingroup
+    \outorb at opt{#1}%
+    \expandafter\outorb at outorb@vmode% \endgroup
+  \else
+    \outorb at prologue% \begingroup
+    \outorb at opt{#1}%
+    \expandafter\outorb at outorb% \endgroup (\outorb at epilogue)
+  \fi
+}
+\def\outorb at outorb#1#2{%
+  \def\outorb at outorb@tempa{%
+    \outorb at outorb@main{#1}{#2}%
+  }%
+  \ifpxrr at safe@mode
+    \expandafter\outorb at outorb@tempa
+  \else
+    \expandafter\outorb at outorb@check at kinsoku\expandafter\outorb at outorb@tempa
+  \fi
+}
+\def\outorb at outorb@check at kinsoku#1{%
+  \pxrr at abodyfalse
+  \pxrr at check@kinsoku#1%
+}
+\def\outorb at outorb@main#1#2{%
+  \edef\outorb at after@penalty{\the\pxrr at cntr}%
+  \ifnum\outorb at after@penalty>\outorb at iM
+    \outorb at outorb@anobrtrue
+  \else
+    \outorb at opt@ifnobreakTF\outorb at opt@parse at asub{%
+      \outorb at outorb@anobrtrue
+    }{%
+      \outorb at outorb@anobrfalse
+    }%
+  \fi
+  \ifnum\outorb at before@penalty>\outorb at iM
+    \outorb at outorb@bnobrtrue
+  \else
+    \outorb at opt@ifnobreakTF\outorb at opt@parse at bsub{%
+      \outorb at outorb@bnobrtrue
+    }{%
+      \outorb at outorb@bnobrfalse
+    }%
+  \fi
+  \ltx at LocalAppendToMacro\outorb at outorb@pre{%
+    \hskip\outorb at before@glue\relax
+  }%
+  \expandafter\ltx at LocalAppendToMacro\expandafter\outorb at outorb@pre\expandafter{%
+    \outorb at opt@pre
+  }%
+  \expandafter\ltx at LocalAppendToMacro\expandafter\outorb at outorb@post\expandafter{%
+    \outorb at opt@post
+  }%
+  \pxrr at decompbar{#1}%
+  \let\outorb at body@list\pxrr at res
+  \edef\outorb at body@count{\the\pxrr at cntr}%
+  \pxrr at decompbar{#2}%
+  \let\outorb at ruby@list\pxrr at res
+  \edef\outorb at ruby@count{\the\pxrr at cntr}%
+  \ifpxrr at safe@mode
+    \pxrr at unite@group\outorb at body@list
+    \def\outorb at body@count{1}%
+    \pxrr at unite@group\outorb at ruby@list
+    \def\outorb at ruby@count{1}%
+  \fi
+  \ifnum\outorb at body@count>\ltx at one
+    \ifnum\outorb at body@count=\outorb at ruby@count\relax
+      \outorb at outorb@mj{#1}{#2}%
+    \else
+      \outorb at err{%
+        \string\outoruby\ltx at space group count mismatch (\outorb at body@count <> \outorb at ruby@count)%
+      }%
+    \fi
+  \else
+    \ifpxrr at safe@mode\else
+      \pxrr at decompose{#1}%
+      \ifnum\outorb at ruby@count=\pxrr at cntr
+        \let\outorb at body@list\pxrr at res
+        \edef\outorb at body@count{\the\pxrr at cntr}%
+      \fi
+    \fi
+    \ifnum\outorb at body@count=\ltx at one
+      \outorb at outorb@mj{#1}{#2}%
+    \else\ifnum\outorb at body@count=\outorb at ruby@count\relax
+      \outorb at outorb@mj{#1}{#2}%
+    \else
+      \outorb at err{%
+        \string\outoruby\ltx at space group count mismatch (\outorb at body@count <> \outorb at ruby@count)%
+      }%
+    \fi\fi
+  \fi
+  \outorb at epilogue
+}
+\def\outorb at outorb@mj{%
+  \expandafter\outorb at pxrr@product at list\expandafter{\outorb at body@list}%
+  \expandafter\outorb at pxrr@pair at list\expandafter{\outorb at res}%
+  \let\outorb at body@product at list\outorb at res
+  \expandafter\outorb at pxrr@product at list\expandafter{\outorb at ruby@list}%
+  \expandafter\outorb at pxrr@pair at list\expandafter{\outorb at res}%
+  \let\outorb at ruby@product at list\outorb at res
+  \pxrr at zip@list\outorb at body@product at list\outorb at ruby@product at list
+  \let\pxrr at pre\outorb at outorb@mj at pre
+  \let\pxrr at inter\outorb at outorb@mj at inter
+  \let\pxrr at post\outorb at outorb@mj at post
+  \let\outorb at outorb@disc at list\ltx at empty
+  \pxrr at res
+}
+\ltx at newif\ifoutorb at outorb@bnobr% before no break
+\ltx at newif\ifoutorb at outorb@anobr% after no break
+\def\outorb at outorb@mj at pre#1#2{%
+  \ifoutorb at outorb@bnobr
+  \else
+    \outorb at outorb@mj at makeruby#1#2%
+  \fi
+}
+\def\outorb at outorb@mj at inter#1#2{%
+  \pxrr at if@last{%
+    \ifoutorb at outorb@anobr
+    \else
+      \outorb at outorb@mj at makeruby#1#2%
+    \fi
+  }{%
+    \outorb at outorb@mj at makeruby#1#2%
+  }%
+}
+\def\outorb at outorb@mj at makeruby#1#2#3#4{%
+  \let\outorb at outorb@mj at makeruby@pre\pxrr at pre
+  \let\outorb at outorb@mj at makeruby@inter\pxrr at inter
+  \let\outorb at outorb@mj at makeruby@post\pxrr at post
+  \outorb at pxrr@ifemptyTF{#1}{%
+    \def\outorb at outorb@mj at makeruby@pre at list{}%
+  }{%
+    \edef\outorb at outorb@mj at makeruby@pre at list{%
+      \outorb at outorb@cmd at prebreak
+    }%
+    \outorb at pxrr@join at list{}{#1}%
+    \expandafter\ltx at LocalAppendToMacro
+      \expandafter\outorb at outorb@mj at makeruby@pre at list
+      \expandafter{%
+        \expandafter{\outorb at res}%
+    }%
+    \outorb at pxrr@join at list{|}{#3}%
+    \expandafter\ltx at LocalAppendToMacro
+      \expandafter\outorb at outorb@mj at makeruby@pre at list
+      \expandafter{%
+        \expandafter{\outorb at res}%
+    }%
+  }%
+  \outorb at pxrr@ifemptyTF{#2}{%
+    \def\outorb at outorb@mj at makeruby@post at list{}%
+  }{%
+    \edef\outorb at outorb@mj at makeruby@post at list{%
+      \outorb at outorb@cmd at postbreak
+    }%
+    \outorb at pxrr@join at list{}{#2}%
+    \expandafter\ltx at LocalAppendToMacro
+      \expandafter\outorb at outorb@mj at makeruby@post at list
+      \expandafter{%
+        \expandafter{\outorb at res}%
+    }%
+    \outorb at pxrr@join at list{|}{#4}%
+    \expandafter\ltx at LocalAppendToMacro
+      \expandafter\outorb at outorb@mj at makeruby@post at list
+      \expandafter{%
+        \expandafter{\outorb at res}%
+    }%
+  }%
+  \expandafter\ltx at LocalAppendToMacro\expandafter\outorb at outorb@disc at list\expandafter{%
+    \expandafter{\outorb at outorb@mj at makeruby@pre at list}%
+  }%
+  \expandafter\ltx at LocalAppendToMacro\expandafter\outorb at outorb@disc at list\expandafter{%
+    \expandafter{\outorb at outorb@mj at makeruby@post at list}%
+  }%
+  \let\pxrr at pre\outorb at outorb@mj at makeruby@pre
+  \let\pxrr at inter\outorb at outorb@mj at makeruby@inter
+  \let\pxrr at post\outorb at outorb@mj at makeruby@post
+}
+\def\outorb at outorb@mj at post#1#2{%
+  \def\outorb at res{%
+    \outorb at discretionary
+  }%
+  \expandafter\ltx at LocalAppendToMacro\expandafter\outorb at res\expandafter{%
+    \expandafter{\outorb at outorb@disc at list}%
+  }%
+  \edef\outorb at outorb@mj at makeruby@nobreak{%
+    \outorb at outorb@cmd at nobreak
+  }%
+  \ltx at LocalAppendToMacro\outorb at outorb@mj at makeruby@nobreak{%
+    {#1}{#2}%
+  }%
+  \expandafter\ltx at LocalAppendToMacro\expandafter\outorb at res\expandafter{%
+    \expandafter{\outorb at outorb@mj at makeruby@nobreak}%
+  }%
+  \def\outorb at disccommand{\noexpand\outoruby}%
+  \outorb at res
+}
+\def\outorb at outorb@cmd{\noexpand\outorb at outorb@cmd at jruby}
+\def\outorb at outorb@cmd at prebreak{%
+  \outorb at outorb@cmd
+    \noexpand\outorb at outorb@pre
+    {}%
+    \outorb at opt@prebreak
+}
+\def\outorb at outorb@cmd at postbreak{%
+  \outorb at outorb@cmd
+    {}%
+    \noexpand\outorb at outorb@post
+    \outorb at opt@postbreak
+}
+\def\outorb at outorb@cmd at nobreak{%
+  \outorb at outorb@cmd
+    \noexpand\outorb at outorb@pre
+    \noexpand\outorb at outorb@post
+    \outorb at opt@nobreak
+}
+\def\outorb at outorb@cmd at jruby#1#2[#3]#4#5{%
+  \hbox{%
+    #1%
+    \outorb at cmd@jruby[#3]{#4}{#5}%
+    #2%
+  }%
+}
+\def\outorb at outorb@cmd at vmode{%
+  \noexpand\outorb at cmd@jruby\outorb at opt@nobreak
+}
+\def\outorb at cmd@jruby{\jruby}
+\def\outorb at outorb@vmode{%
+  \ltx at LocToksA\expandafter{\outorb at opt@pre}%
+  \ltx at LocToksB\expandafter{\outorb at opt@post}%
+  \edef\outorb at tempa##1##2{%
+    \the\ltx at LocToksA
+    \outorb at outorb@cmd at vmode{##1}{##2}%
+    \the\ltx at LocToksB
+  }%
+  \expandafter\endgroup\outorb at tempa
+}
+\def\outorb at prologue{%
+  \begingroup
+  \rubynousejghost
+  \outorb at hyphen@check
+  \let\outorb at outorb@pre\ltx at empty
+  \let\outorb at outorb@post\ltx at empty
+  \outorb at bgluepen
+  \penalty\outorb at MM
+  \hbox{}\penalty\outorb at MM
+}
+\def\outorb at bgluepen{%
+  \ltx at LocSkipA0pt\relax
+  \pxrr at cnta=\ltx at zero
+  \outorb at bgluepen@do
+  \edef\outorb at before@glue{\the\ltx at LocSkipA}%
+  \edef\outorb at before@penalty{\the\pxrr at cnta}%
+}
+\pxrr at ifprimitive\lastnodetype{% e-TeX
+  \def\outorb at bgluepen@do{%
+    \ifnum\lastnodetype=11
+      \advance\ltx at LocSkipA\lastskip
+      \unskip
+      \expandafter\outorb at bgluepen@do
+    \else\ifnum\lastnodetype=13
+      \advance\pxrr at cnta\lastpenalty
+      \unpenalty
+      \expandafter\expandafter\expandafter\outorb at bgluepen@do
+    \fi\fi
+  }%
+}{% non e-TeX
+  \def\outorb at bgluepen@do{%
+    \outorb at bgluepen@remove
+    \outorb at bgluepen@remove
+    \outorb at bgluepen@remove
+    \ifnum\lastskip=\ltx at zero\else
+      \expandafter\outorb at bgluepen@do
+    \else\ifnum\lastpenalty=\ltx at zero\else
+      \expandafter\expandafter\expandafter\outorb at bgluepen@do
+    \fi\fi
+  }%
+}
+\def\outorb at bgluepen@remove{%
+  \ifnum\lastskip=\ltx at zero\else
+    \advance\ltx at LocSkipA\lastskip
+  \fi
+  \unskip
+  \ifnum\lastpenalty=\ltx at zero\else
+    \advance\pxrr at cnta\lastpenalty
+  \fi
+  \unpenalty
+}
+\def\outorb at epilogue{%
+  \penalty\outorb at MM
+  \hbox{}\penalty\outorb at MM
+  \endgroup
+  \pxrr at inhibitglue
+  \ignorespaces
+}
+\def\outorb at hyphen@check{%
+  \ifnum\hyphenpenalty>\outorb at iM
+    \outorb at hyphen@warn at nobreak
+  \else\ifnum\hyphenpenalty>100
+    \outorb at hyphen@warn at maynotbreak
+  \fi\fi
+}
+\def\outorb at hyphen@warn at nobreak{%
+  \global\let\outorb at hyphen@warn at nobreak\relax
+  \outorb at warn{%
+    The \string\hyphenpenalty\ltx at space value \the\hyphenpenalty\ltx at space too large.\MessageBreak
+    \string\outoruby will not break.\MessageBreak
+    Using \string\outorubyhyphenbreakable\ltx at space may help it improve%
+  }%
+}
+\def\outorb at hyphen@warn at maynotbreak{%
+  \global\let\outorb at hyphen@warn at maynotbreak\relax
+  \outorb at warn{%
+    The \string\hyphenpenalty\ltx at space value \the\hyphenpenalty\ltx at space too large.\MessageBreak
+    \string\outoruby may not break.\MessageBreak
+    Using \string\outorubyhyphenbreakable\ltx at space may help it improve%
+  }%
+}
+\outorb at errifdefined\outorubyhyphenbreakable
+\outorb at protected\def\outorubyhyphenbreakable{
+  \ltx at ifnextchar[{\outorb at hyphenbreakable}{\outorb at hyphenbreakable[0]}%
+}
+\let\outorb at hyphenbreakable\outorubyhyphenbreakable
+\def\outorb at hyphenbreakable[#1]{%
+  \outorb at hyphenpenalty@min\hyphenpenalty{\outorb at getpen{#1}}%
+  \outorb at hyphenpenalty@min\doublehyphendemerits{\outorb at getpen{#1}}%
+  \outorb at hyphenpenalty@min\finalhyphendemerits{\outorb at getpen{#1}}%
+}
+\def\outorb at hyphenpenalty@min#1#2{%
+  \ifnum#1>#2\relax
+    #1=#2\relax
+  \fi
+}
+\def\outorb at exp@opt#1#2#{%
+  \outorb at exp@opt at loop{#1}{}#2[\outorb at nil}
+\def\outorb at exp@opt at loop#1#2#3[#4\outorb at nil{%
+  \ltx at ifempty{#4}{%
+    #1{#2#3}%
+  }{%
+    \outorb at exp@opt at chop@open{#1}{#2#3[}#4\outorb at nil
+  }%
+}
+\def\outorb at exp@opt at chop@open#1#2#3[\outorb at nil{%
+  \outorb at exp@opt at bracket{#1}{#2}#3]\outorb at nil
+}
+\def\outorb at exp@opt at bracket#1#2#3]#4\outorb at nil{%
+  \ltx at ifempty{#4}{%
+    \outorb at exp@opt at brace{#1}{#2#3}.%
+  }{%
+    \outorb at exp@opt at chop@close{#1}{#2#3]}#4\outorb at nil
+  }%
+}
+\def\outorb at exp@opt at brace#1#2#3]{%
+  \expandafter\outorb at exp@opt at brace@next\expandafter{\ltx at gobble #3]}{#1}{#2}%
+}
+\def\outorb at exp@opt at brace@next#1#2#3#4#{%
+  \outorb at exp@opt at loop{#2}{#3#1}#4[\outorb at nil
+}
+\def\outorb at exp@opt at chop@close#1#2#3]\outorb at nil{%
+  \outorb at exp@opt at loop{#1}{#2}#3[\outorb at nil
+}
+\ltx at GlobalAppendToMacro\pdfstringdefPreHook{%
+  \def\outoruby{%
+    \outorb at exp@opt\ltx at secondofthree
+  }%
+  \let\outorb at outoruby\outoruby
+}
+\endinput
+%%
+%% End of file `outoruby.sty'.


Property changes on: branches/branch2024.final/Master/texmf-dist/tex/latex/outoruby/outoruby.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: branches/branch2024.final/Master/tlpkg/libexec/ctan2tds
===================================================================
--- branches/branch2024.final/Master/tlpkg/libexec/ctan2tds	2025-03-02 21:41:07 UTC (rev 74394)
+++ branches/branch2024.final/Master/tlpkg/libexec/ctan2tds	2025-03-02 21:43:10 UTC (rev 74395)
@@ -3442,6 +3442,7 @@
  'nwafuthesis'	=> 'xetex',
  'nwejm'	=> 'tex',
  'nomentbl'     => 'latex -translate-file=empty.tcx',   # no 8-bit
+ 'outoruby'	=> 'tex',
  'pbsheet'      => 'latex',  # requires interaction
  'pdflscape'	=> 'etex',
  'pdfrender'	=> 'etex',

Modified: branches/branch2024.final/Master/tlpkg/tlpsrc/collection-langjapanese.tlpsrc
===================================================================
--- branches/branch2024.final/Master/tlpkg/tlpsrc/collection-langjapanese.tlpsrc	2025-03-02 21:41:07 UTC (rev 74394)
+++ branches/branch2024.final/Master/tlpkg/tlpsrc/collection-langjapanese.tlpsrc	2025-03-02 21:43:10 UTC (rev 74395)
@@ -43,6 +43,7 @@
 depend luatexja
 depend mendex-doc
 depend morisawa
+depend outoruby
 depend pbibtex-base
 depend pbibtex-manual
 depend platex

Added: branches/branch2024.final/Master/tlpkg/tlpsrc/outoruby.tlpsrc
===================================================================
--- branches/branch2024.final/Master/tlpkg/tlpsrc/outoruby.tlpsrc	                        (rev 0)
+++ branches/branch2024.final/Master/tlpkg/tlpsrc/outoruby.tlpsrc	2025-03-02 21:43:10 UTC (rev 74395)
@@ -0,0 +1 @@
+depend pxrubrica



More information about the tex-live-commits mailing list.