From 333540a9182285f9d72d7d39be3fa730c135d664 Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Wed, 6 Apr 2022 03:01:01 +0000
Subject: CTAN sync 202204060301

---
 language/japanese/jlreq/jlreq.cls | 1639 +++++++++++++++++++++----------------
 1 file changed, 942 insertions(+), 697 deletions(-)

(limited to 'language/japanese/jlreq/jlreq.cls')

diff --git a/language/japanese/jlreq/jlreq.cls b/language/japanese/jlreq/jlreq.cls
index a06ad633fc..2f94644b9e 100644
--- a/language/japanese/jlreq/jlreq.cls
+++ b/language/japanese/jlreq/jlreq.cls
@@ -5,25 +5,32 @@
 %%
 % (based on JLReq 20200811 https://www.w3.org/TR/2020/NOTE-jlreq-20200811/)
 \NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{jlreq}[2021/11/05 jlreq]
+\ProvidesClass{jlreq}[2022/04/05 jlreq]
 \RequirePackage{l3keys2e}
 \RequirePackage{etoolbox}
-\RequirePackage{jlreq-helpers}
+\RequirePackage{jlreq-helpers}[2021/08/12]
 
 \ExplSyntaxOn
-\tl_new:N \l_jlreq_tmpa_tl
+\int_new:N \l__jlreq_tmpa_int
+\tl_new:N \l__jlreq_tmpa_tl
+\tl_new:N \l__jlreq_tmpb_tl
+\tl_new:N \l__jlreq_tmpc_tl
 \cs_new:Nn \l_jlreq_do: {}
-\str_new:N \l_jlreq_tmpa_str
-\str_new:N \l_jlreq_tmpb_str
-\str_new:N \l_jlreq_tmpc_str
+\str_new:N \l__jlreq_tmpa_str
+\str_new:N \l__jlreq_tmpb_str
+\str_new:N \l__jlreq_tmpc_str
 \bool_new:N \l_jlreq_tmpa_bool
 \clist_new:N \l_jlreq_tmpa_clist
-\seq_new:N \l_jlreq_tmpa_seq
-\dim_new:N \l_jlreq_tmpa_dim
+\seq_new:N \l__jlreq_tmpa_seq
+\dim_new:N \l__jlreq_tmpa_dim
 \skip_new:N \l_jlreq_tmpa_skip
 \box_new:N \l_jlreq_tmpa_box
 \box_new:N \l_jlreq_tmpb_box
 \box_new:N \l_jlreq_tmpc_box
+\prop_new:N \l__jlreq_tmpa_prop
+
+\tl_new:N \l__jlreq_result_tl
+\prop_new:N \l__jlreq_result_prop
 
 \cs_set:Nn \__jlreq_undeferr:n {\ClassError{jlreq}{Trying~to~delete~\string#1~even~though~it~is~not~defined,~may~be~a~bug}{\@ehc}}
 % クラスファイル内でしか使わないマクロをクラスファイル終了時に未定義にする
@@ -66,11 +73,29 @@
   \expandafter\endgroup
   \jlreq@do
 }
+
 \def\jlreq@useoriginalcs#1{%
   \jlreq@if{\ifcsname jlreq@original@#1\endcsname\fi}%
     {\csname jlreq@original@#1\endcsname}%
     {#1}%
 }
+\def\jlreq@useoriginalcs@witharguments#1#2{%
+  \group_begin:
+    \tl_set:Nx \l__jlreq_do_tl {
+      \exp_not:n{\escapechar=`\\\relax}%
+      \exp_not:n{\catcode`@=11\relax}%
+      \exp_not:N \scantokens{%
+        \jlreq@if{\ifcsname jlreq@original@#1\endcsname\fi}%
+          {\exp_not:o {\csname jlreq@original@#1\endcsname}}%
+          {\exp_not:o {\csname #1\endcsname}}%
+          \exp_not:n {#2}%
+      }
+      \exp_not:N \catcode`@=\the\catcode`@\exp_not:N \relax
+      \exp_not:N \escapechar=\the\escapechar\exp_not:N \relax
+    }
+  \exp_after:wN \group_end:
+  \l__jlreq_do_tl
+}
 \def\jlreq@restoreoriginalcs#1{%
   \jlreq@if{\ifcsname jlreq@original@\expandafter\@gobble\string#1\endcsname\fi}%
     {\expandafter\let\expandafter#1\csname jlreq@original@\expandafter\@gobble\string#1\endcsname}{}%
@@ -113,8 +138,7 @@
 }
 \keys_define:nn { jlreq } {
   paper .code:n = {
-    \str_case:nVF {#1} \g__jlreq_papersizelist_tl
-    {
+    \str_case:nVF {#1} \g__jlreq_papersizelist_tl {
       \jlreq@helper@dividebycomma{#1}%
       \legacy_if:nTF { jlreq@result } {
         \setlength{\paperwidth}{\dimexpr\jlreq@resulta\relax}
@@ -303,13 +327,13 @@
 
 %.. 柱とノンブル
 % 本文とヘッダ/フッタの間の空き
-\keys_define:nn { jlreq } { headfoot_verticalposition .tl_set:N = \jlreq@option@headfoot@verticalpos}
+\keys_define:nn { jlreq } { headfoot_verticalposition .tl_set:N = \jlreq@option@headfoot@verticalpos }
 \__jlreq_aftercls_addtodeletecs:N \jlreq@option@headfoot@verticalpos
 % 柱やノンブルの左右の空き
-\keys_define:nn { jlreq } { headfoot_sidemargin .tl_set:N = \jlreq@headfoot@sidemargin}
+\keys_define:nn { jlreq } { headfoot_sidemargin .tl_set:N = \jlreq@headfoot@sidemargin }
 
 %.. 段間
-\keys_define:nn { jlreq } { column_gap .tl_set:N = \jlreq@option@column@gap}
+\keys_define:nn { jlreq } { column_gap .tl_set:N = \jlreq@option@column@gap }
 \__jlreq_aftercls_addtodeletecs:N \jlreq@option@column@gap
 
 %.. 行送り，指定無しの場合は文字サイズの1.7倍とする．（1.5から2倍が好ましい：2.4.2.d 注3）
@@ -500,7 +524,7 @@
 
 % #1の先頭が文字か
 \long\def\jlreq@ifletter#1{%
-  \jlreq@iffirsttoken{#1}{ }{\@secondoftwo}{%
+  \jlreq@iffirsttoken{#1}{~}{\@secondoftwo}{%
     \expandafter\expandafter\expandafter\jlreq@helper@ifletter\jlreq@getfirsttoken#1\jlreq@uniqtoken{}\jlreq@endmark@
   }%
 }
@@ -805,25 +829,29 @@
     \def\DeclareFontShape#1#2#3#4#5#6{
     \group_begin:
       \bool_if:nT { \str_if_eq_p:nn {#1} {JY3} || \str_if_eq_p:nn {#1} {JT3} } {
-        \tl_set:Nx \l_jlreq_tmpa_tl {#5}
-        \tl_if_in:NnTF \l_jlreq_tmpa_tl { jfm=jlreq} {
-          \tl_if_in:NnTF \l_jlreq_tmpa_tl { jfm=jlreqv }{
-            \tl_replace_all:Nnn \l_jlreq_tmpa_tl { jfm=jlreqv } { jfm=jlreqv-jidori }
+        \tl_set:Nx \l__jlreq_tmpa_tl {#5}
+        \tl_if_in:NnTF \l__jlreq_tmpa_tl { jfm=jlreq} {
+          \tl_if_in:NnTF \l__jlreq_tmpa_tl { jfm=jlreqv }{
+            \tl_replace_all:Nnn \l__jlreq_tmpa_tl { jfm=jlreqv } { jfm=jlreqv-jidori }
           }{
-            \tl_replace_all:Nnn \l_jlreq_tmpa_tl { jfm=jlreq  } { jfm=jlreq-jidori  }
+            \tl_replace_all:Nnn \l__jlreq_tmpa_tl { jfm=jlreq  } { jfm=jlreq-jidori  }
           }
           \cs_set:Nx \l_jlreq_do: {
-            \exp_not:n{ \jlreq@useoriginalcs{DeclareFontShape} {#1} {#2} {#3} { #4-jidori } }
-            { \tl_use:N \l_jlreq_tmpa_tl } {#6}
+            \exp_not:N \jlreq@useoriginalcs@witharguments{DeclareFontShape} {
+              \exp_not:n { {#1} {#2} {#3} { #4-jidori } }
+              { \tl_use:N \l__jlreq_tmpa_tl } { \exp_not:n {#6} }
+            }
           }
         }{
-          \tl_if_in:NnT \l_jlreq_tmpa_tl {<->ssub} {
-            \cs_set:Nn \l_jlreq_do: {\jlreq@useoriginalcs{DeclareFontShape} {#1} {#2} {#3} { #4-jidori } {#5} {#6} }
+          \tl_if_in:NnT \l__jlreq_tmpa_tl {<->ssub} {
+            \cs_set:Nn \l_jlreq_do: {
+              \jlreq@useoriginalcs@witharguments{DeclareFontShape} { {#1} {#2} {#3} { #4-jidori } {#5} {#6} }
+            }
           }
         }
       }
     \exp_after:wN \group_end: \l_jlreq_do:
-    \jlreq@useoriginalcs{DeclareFontShape} {#1} {#2} {#3} {#4} {#5} {#6}
+    \jlreq@useoriginalcs@witharguments{DeclareFontShape} { {#1} {#2} {#3} {#4} {#5} {#6} }
   }
   \DeclareFontShape{JY3}{mc}{m}{n}{<->s*[\jlreq@jafontscale]\ltj@stdmcfont :jfm=jlreq;script=latn;-kern}{}
   \DeclareFontShape{JY3}{gt}{m}{n}{<->s*[\jlreq@jafontscale]\ltj@stdgtfont :jfm=jlreq;script=latn;-kern}{}
@@ -890,16 +918,17 @@
 \edef\jlreq@charlist@katakana{アイウエオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモヤユヨラリルレロワヰヱヲンヴ\ifx p\jlreq@engine\else ヷヸヹヺ\fi}% カ゚キ゚ク゚ケ゚コ゚セ゚ツ゚ト゚
 
 %.. 行頭括弧調整
-\jlreq@saveoriginalcs{item}
 \ifx l\jlreq@engine
   % \itemの直後は折り返し行頭と同じにする．
+  \jlreq@saveoriginalcs{@item}
   \cs_set:Nn \__jlreq_hook_everypar: {}
-  \renewcommand*{\item}{%
+  \def\@item[#1]{%
     \cs_set:Nn \__jlreq_hook_everypar: { \cs_set:Nn \__jlreq_hook_everypar: {} \inhibitglue }
+    \jlreq@useoriginalcs{@item}[#1]%
     \expandafter\everypar\expandafter{\the\everypar\__jlreq_hook_everypar:}
-    \jlreq@useoriginalcs{item}%
   }
 \else
+  \jlreq@saveoriginalcs{item}
   \AtBeginDocument{\PushPostHook{par}{\jlreq@hook@everypar}}
   \def\jlreq@hook@everypar{}
   % 非LuaTeXの場合はJFMの入れ替えと\everyparでの処理で対処．
@@ -1156,7 +1185,7 @@
 \ifx l\jlreq@engine
   {
     \catcode`　=\active
-    \global\let　=\jlreq@zenkakuspace@main
+    \protected\gdef　{\futurelet\jlreq@nextchar\jlreq@zenkakuspace@ignorespaces}
   }
   \AtBeginDocument{\catcode`　=\active}
 \fi
@@ -1651,7 +1680,7 @@
 %. システム設定
 %.. 逆ノンブル
 \ifjlreq@option@use@reverse@pagination
-  \AtEndDocument{\clearpage\jlreq@reference@immediate@write{lastpage}{\noexpand\arabic{page}}}%
+  \AtEndDocument{\clearpage\jlreq@reference@immediate@write{lastpage}{\arabic{page}}}%
   \def\c@jlreqreversepage{\numexpr\jlreq@reference@ref{lastpage}{0} - \c@page + 1\relax}
   \def\thejlreqreversepage{\arabic{jlreqreversepage}}
 \fi
@@ -1895,9 +1924,8 @@
   \expandafter\xdef\csname jlreq@BlockHeading@spaces@current@space@\the\jlreq@BlockHeading@spaces@current@count\endcsname{%
     \exp_not:o {\jlreq@tempb}%
   }%
-  \def\@tempa##1##2##3{##1}%
+  \long\def\@tempa##1##2##3{##1}%
   \expandafter\xdef\csname jlreq@BlockHeading@spaces@current@before@\the\jlreq@BlockHeading@spaces@current@count\endcsname{%
-    \noexpand\allowbreak
     \exp_not:o {\@tempa#4}%
     \exp_not:o {\jlreq@resulta}%
     \ifjlreq@tempa\unexpanded{%
@@ -1905,11 +1933,11 @@
       \edef\jlreq@BlockHeading@currentpage{\the\jlreq@currentpage}%
     }\fi
   }%
-  \def\@tempa##1##2##3{##2}%
+  \long\def\@tempa##1##2##3{##2}%
   \expandafter\xdef\csname jlreq@BlockHeading@spaces@current@format@\the\jlreq@BlockHeading@spaces@current@count\endcsname{%
     \exp_not:o {\@tempa#4}%
   }%
-  \def\@tempa##1##2##3{##3}%
+  \long\def\@tempa##1##2##3{##3}%
   \expandafter\xdef\csname jlreq@BlockHeading@spaces@current@after@\the\jlreq@BlockHeading@spaces@current@count\endcsname{%
     \exp_not:o {\jlreq@resultc}%
     \ifjlreq@tempa\unexpanded{%
@@ -2115,13 +2143,13 @@
   \jlreq@tempskipa=0pt
   \jlreq@tempskipb=0pt
   \jlreq@tempskipc=0pt
-  \tl_set_rescan:Nnn \l_jlreq_tmpa_tl {\ExplSyntaxOn}{#1}
-%  \message{[[[\expandafter\getcatcode\l_jlreq_tmpa_tl]]]}
-  \__jlreq_BlockHeading_start_analyzespace:V \l_jlreq_tmpa_tl
+  \tl_set_rescan:Nnn \l__jlreq_tmpa_tl {\ExplSyntaxOn}{#1}
+%  \message{[[[\expandafter\getcatcode\l__jlreq_tmpa_tl]]]}
+  \__jlreq_BlockHeading_start_analyzespace:V \l__jlreq_tmpa_tl
   \let\jlreq@maeakitype=\jlreq@resulta
   \let\jlreq@maeaki=\jlreq@resultb
-  \tl_set_rescan:Nnn \l_jlreq_tmpa_tl {\ExplSyntaxOn}{#2}
-  \__jlreq_BlockHeading_start_analyzespace:V \l_jlreq_tmpa_tl
+  \tl_set_rescan:Nnn \l__jlreq_tmpa_tl {\ExplSyntaxOn}{#2}
+  \__jlreq_BlockHeading_start_analyzespace:V \l__jlreq_tmpa_tl
   \let\jlreq@ushiroakitype=\jlreq@resulta
   \let\jlreq@ushiroaki=\jlreq@resultb
   \def\jlreq@lines{#3}%
@@ -2212,7 +2240,6 @@
 % 行取り情報をゲットだぜ
 % \jlreq@resultに{1 = 前空き}{2 = 後ろ空き}{3 = トータル行数}を入れる
 % #2#3#4はそれぞれ前空き，後ろ開き，トータル行数のデフォルト値
-% *つきは\setkeys*を使う．[]はkeyvalのファミリー．
 \def\jlreq@BlockHeading@gyodori@parsekeyval{%
   \@ifstar{\jlreq@BlockHeading@gyodori@parsekeyval@{*}}{\jlreq@BlockHeading@gyodori@parsekeyval@{}}%
 }
@@ -2241,11 +2268,16 @@
     \keys_set:nn {#2} {#3} 
     % before/after_lines優先
     \tl_if_empty:NF \l__jlreq_before_space_tl { \tl_put_left:Nn \l__jlreq_before_space_tl {r:} }
-    \tl_if_empty:NF \l__jlreq_before_lines_tl { \tl_set:Nx \l__jlreq_before_space_tl {\exp_not:o {\l__jlreq_before_lines_tl} \baselineskip } }
+    \tl_if_empty:NF \l__jlreq_before_lines_tl { \tl_set:Nx \l__jlreq_before_space_tl {\exp_not:o {\l__jlreq_before_lines_tl} \exp_not:N \baselineskip } }
     \tl_if_empty:NT \l__jlreq_before_space_tl { \tl_set:Nn \l__jlreq_before_space_tl {#4} }
     \tl_if_empty:NF \l__jlreq_after_space_tl { \tl_put_left:Nn \l__jlreq_after_space_tl {r:} }
-    \tl_if_empty:NF \l__jlreq_after_lines_tl { \tl_set:Nx \l__jlreq_after_space_tl { a:\exp_not:o {\l__jlreq_after_lines_tl} \baselineskip } }
+    \tl_if_empty:NF \l__jlreq_after_lines_tl { \tl_set:Nx \l__jlreq_after_space_tl { a:\exp_not:o {\l__jlreq_after_lines_tl} \exp_not:N \baselineskip } }
     \tl_if_empty:NT \l__jlreq_after_space_tl { \tl_set:Nn \l__jlreq_after_space_tl {#5} }
+    % 内部での空き指定は[asr]:(寸法)の形
+    % prefixのasrは次の意味：
+    % r -> before/after_spaceの指定
+    % a -> before/after_linesの指定
+    % s -> beforelinesの指定だが*つき．
     \cs_set:Nx \l__jlreq_do: {
       \exp_not:n {\def\jlreq@result}{
         {\exp_not:o {\l__jlreq_before_space_tl } }
@@ -2510,7 +2542,11 @@
             {}{}%
           }%
         }%
-        {{}{\exp_not:o {\jlreq@totalformat}}{\exp_not:o {\jlreq@totalformat@after}}}%
+        {{\exp_not:n {
+          \par
+          \addpenalty\@secpenalty
+          \addvspace{0pt}\relax % 改ページ関係（#54,#100），よくわかっていない
+        }}{\exp_not:o {\jlreq@totalformat}}{\exp_not:o {\jlreq@totalformat@after}}}%
       }}%
       \noexpand\def\exp_not:c {#1}{\exp_not:c {jlreq@headingcs@#1}}%
     }%
@@ -2554,7 +2590,7 @@
 % \jlreq@BlockHeading@spaces@current@after@<n>
 %   : n番目の見出しの後ろに出すもの
 % \jlreq@BlockHeading@spaces@current@count
-%   : 現在いくつ目の連続する見出しを処理しているかのカウンター
+%   : 現在いくつの連続する見出しを処理しているかのカウンター
 \newcount\jlreq@BlockHeading@spaces@current@count
 \jlreq@BlockHeading@spaces@current@count=0
 \def\jlreq@BlockHeading@spaces@current@sequence{}
@@ -2973,22 +3009,22 @@
   % 一行で処理したときの見出し長さを計測
   \group_begin:
     \hbox_set:Nn \l_jlreq_tmpa_box {#1#6}
-    \dim_set:Nn \l_jlreq_tmpa_dim { \box_wd:N \l_jlreq_tmpa_box}
+    \dim_set:Nn \l__jlreq_tmpa_dim { \box_wd:N \l_jlreq_tmpa_box}
     % 何行必要かを\l__jlreq_cutinheading_linecount_tlに入れる
-    \dim_compare:nTF { \l_jlreq_tmpa_dim > #5} {
+    \dim_compare:nTF { \l__jlreq_tmpa_dim > #5} {
       \tl_set:Nn \l__jlreq_cutinheading_linecount_tl {3}
     }{
-      \dim_compare:nTF { \l_jlreq_tmpa_dim > #4 }{
+      \dim_compare:nTF { \l__jlreq_tmpa_dim > #4 }{
         \tl_set:Nn \l__jlreq_cutinheading_linecount_tl {2}
       } { \tl_set:Nn \l__jlreq_cutinheading_linecount_tl {1} } }
-    % \l_jlreq_tmpa_dimが実際の一行の長さに近い
-    \dim_set:Nn \l_jlreq_tmpa_dim { \l_jlreq_tmpa_dim / \l__jlreq_cutinheading_linecount_tl }
+    % \l__jlreq_tmpa_dimが実際の一行の長さに近い
+    \dim_set:Nn \l__jlreq_tmpa_dim { \l__jlreq_tmpa_dim / \l__jlreq_cutinheading_linecount_tl }
     % \l_jlreq_tmpb_boxに見出し部分を，\l__jlreq_cutinheading_linecount_tlに見出し自身に何行使うかを入れる
     \int_compare:nTF { \l__jlreq_cutinheading_linecount_tl = 1 }{
       \vbox_set:Nn \l_jlreq_tmpb_box {\parindent=0pt\rightskip=0pt\leftskip=0pt\hbox_unpack_drop:N \l_jlreq_tmpa_box}
       \tl_set:Nn \l__jlreq_cutinheading_linecount_tl {2}
     }{
-      \jlreq@inlinenote@determinelength{#6}{#1}{}{\l__jlreq_cutinheading_linecount_tl}{\l__jlreq_cutinheading_linecount_tl}{\l_jlreq_tmpa_dim}{\linewidth}%
+      \jlreq@inlinenote@determinelength{#6}{#1}{}{\l__jlreq_cutinheading_linecount_tl}{\l__jlreq_cutinheading_linecount_tl}{\l__jlreq_tmpa_dim}{\linewidth}%
       \box_set_eq:NN \l_jlreq_tmpb_box \jlreq@resultbox
       \tl_set:Nn \l__jlreq_cutinheading_linecount_tl {3}
     }
@@ -3077,25 +3113,25 @@
 \NewDocumentCommand{\ModifyHeading}{m +m}{
   \@ifundefined { jlreq@heading@setting@#1 } { \ClassError{jlreq}{Unknown~heading:~#1}{\@ehc} } {}
   \group_begin:
-    \tl_set:Nn \l_jlreq_tmpa_tl {#2}
-    \str_set:Nn \l_jlreq_tmpa_str {#2}
+    \tl_set:Nn \l__jlreq_tmpa_tl {#2}
+    \str_set:Nn \l__jlreq_tmpa_str {#2}
     \str_case_e:nn { \jlreq@HeadingType {#1} } {
       { BlockHeading } {
         \bool_set_false:N \l_jlreq_tmpa_bool
-        \str_if_in:NnT \l_jlreq_tmpa_str { before_space=  } { \bool_set_true:N \l_jlreq_tmpa_bool }
-        \str_if_in:NnT \l_jlreq_tmpa_str { before_space~= } { \bool_set_true:N \l_jlreq_tmpa_bool }
-        \bool_if:NT \l_jlreq_tmpa_bool {\tl_put_left:Nn \l_jlreq_tmpa_tl {before_lines={},} }
+        \str_if_in:NnT \l__jlreq_tmpa_str { before_space=  } { \bool_set_true:N \l_jlreq_tmpa_bool }
+        \str_if_in:NnT \l__jlreq_tmpa_str { before_space~= } { \bool_set_true:N \l_jlreq_tmpa_bool }
+        \bool_if:NT \l_jlreq_tmpa_bool {\tl_put_left:Nn \l__jlreq_tmpa_tl {before_lines={},} }
         \bool_set_false:N \l_jlreq_tmpa_bool
-        \str_if_in:NnT \l_jlreq_tmpa_str { after_space=  } { \bool_set_true:N \l_jlreq_tmpa_bool }
-        \str_if_in:NnT \l_jlreq_tmpa_str { after_space~= } { \bool_set_true:N \l_jlreq_tmpa_bool }
-        \bool_if:NT \l_jlreq_tmpa_bool {\tl_put_left:Nn \l_jlreq_tmpa_tl {after_lines={},}}
+        \str_if_in:NnT \l__jlreq_tmpa_str { after_space=  } { \bool_set_true:N \l_jlreq_tmpa_bool }
+        \str_if_in:NnT \l__jlreq_tmpa_str { after_space~= } { \bool_set_true:N \l_jlreq_tmpa_bool }
+        \bool_if:NT \l_jlreq_tmpa_bool {\tl_put_left:Nn \l__jlreq_tmpa_tl {after_lines={},}}
       }
     }
     \cs_set:Nx \l_jlreq_do: {
       \exp_args:Nc \exp_not:o { jlreq@heading@type@#1 }
       { \exp_not:n { #1 } }
       { \exp_args:Nc \exp_not:o { jlreq@heading@level@#1 } }
-      { \exp_args:Nc \exp_not:o { jlreq@heading@setting@#1 },\exp_not:V \l_jlreq_tmpa_tl }
+      { \exp_args:Nc \exp_not:o { jlreq@heading@setting@#1 },\exp_not:V \l__jlreq_tmpa_tl }
     }
   \exp_after:wN \group_end:
   \l_jlreq_do:
@@ -3257,7 +3293,6 @@
   }
 }
 
-\newcommand{\@makefntext}[1]{\jlreq@makefntext{#1}}
 \keys_define:nn { jlreqsetup } {
   footnote_second_indent .code:n = {
     \legacy_if:nF { @tate }{
@@ -3266,27 +3301,29 @@
         ( \dim_compare_p:n { -1.01\jlreq@zw < #1 } && \dim_compare_p:n { #1 < -0.99\jlreq@zw } )
       }{\jlreq@note{脚注が2行以上となった場合，脚注の2行目以下の字下げを1行目より，脚注の文字サイズの全角アキとするか，逆に，1行目の字下げを2行目より，脚注の文字サイズの全角アキとする~(4.2.5.d)．}}
     }
-    \cs_set:Npn \jlreq@makefntext ##1 {
-      \skip_if_eq:nnF { #1 } { 0pt } { \addtolength{\leftskip}{\glueexpr #1\relax} }
-      % インデントの計算：脚注の長さが文字の整数倍になるように字下げする（4.2.5.b）
-      \group_begin:
-        \@tempdima=\dimexpr\columnwidth - \jlreq@footnoteindent\relax
-        \@tempdimb=1\jlreq@zw
-        \divide\@tempdima\@tempdimb \multiply\@tempdima\@tempdimb
-        \cs_set:Nx \l__jlreq_do: {
-          \exp_not:N \addtolength { \exp_not:N \leftskip } {\dim_eval:n { \columnwidth - \@tempdima - 0.0001pt } }
-          \exp_not:n {
-            \parindent=1\jlreq@zw
-            \noindent
-            \hskip-\glueexpr #1\relax
-            \jlreq@referencemark@format{\@thefnmark}%
-            \hskip\glueexpr 1\jlreq@zw\relax
+    % ほかからの更新があったならばこれ以上触らない．
+    \jlreq@if{\ifx\jlreq@saved@@makefntext\@makefntext\fi}{
+      \cs_set:Npn \@makefntext ##1 {
+        \skip_if_eq:nnF { #1 } { 0pt } { \addtolength{\leftskip}{\glueexpr #1\relax} }
+        % インデントの計算：脚注の長さが文字の整数倍になるように字下げする（4.2.5.b）
+        \group_begin:
+          \@tempdima=\dimexpr\columnwidth - \jlreq@footnoteindent\relax
+          \@tempdimb=1\jlreq@zw
+          \divide\@tempdima\@tempdimb \multiply\@tempdima\@tempdimb
+          \cs_set:Nx \l__jlreq_do: {
+            \exp_not:N \addtolength { \exp_not:N \leftskip } {\dim_eval:n { \columnwidth - \@tempdima - 0.0001pt } }
           }
-        }
-      \exp_after:wN \group_end:
-      \l__jlreq_do:
-      ##1
-    }
+        \exp_after:wN \group_end:
+        \l__jlreq_do:
+        \parindent=1\jlreq@zw
+        \noindent
+        \hskip-\glueexpr #1\relax
+        \hbox{\jlreq@referencemark@format{\@thefnmark}}%
+        \hskip\glueexpr 1\jlreq@zw\relax
+        ##1%
+      }
+      \let\jlreq@saved@@makefntext=\@makefntext
+    }{}
   }
 }
 
@@ -3590,7 +3627,7 @@
     \jlreq@tempafalse % headingsが指定された
     \jlreq@tempbfalse % paragraphが指定された
     % \jlreq@tempcにセクション名たちを入れていく
-    \seq_clear:N \l_jlreq_tmpa_seq
+    \seq_clear:N \l__jlreq_tmpa_seq
     \clist_map_variable:nNn {#1} \jlreq@tempa {
       \tl_set:Nx \@tempa { \tl_trim_spaces:o \@tempa }
       \str_case_e:nnF {\jlreq@tempa} {
@@ -3601,7 +3638,7 @@
         }
       }{
         \str_if_eq:eeTF { \str_head:N \jlreq@tempa } {_} {
-          \seq_put_left:Nx \l_jlreq_tmpa_seq { \tl_tail:N \jlreq@tempa }
+          \seq_put_left:Nx \l__jlreq_tmpa_seq { \tl_tail:N \jlreq@tempa }
         }{
          \ClassError{jlreq}{Invalid~value~\jlreq@tempa\space in~endnote_position}{\@ehc}
         }
@@ -3623,7 +3660,7 @@
       \cs_set:Nn \g__jlreq_endnote_hook_beforeheading:n {\theendnotes}
     \else
       \tl_set:Nn \l__jlreq_tmpa_tl {}
-      \seq_map_inline:Nn \l_jlreq_tmpa_seq {
+      \seq_map_inline:Nn \l__jlreq_tmpa_seq {
         \tl_if_empty:nF {##1} {
           \tl_put_right:Nn \l__jlreq_tmpa_tl { {##1} {\theendnotes} }
         }
@@ -3765,6 +3802,21 @@
   \ifvmode\leavevmode\fi
   \IfBooleanTF {#1} { \jlreq@inlinenote@noauto {#2} } { \jlreq@inlinenote@auto {#2} }
 }
+\keys_define:nn { jlreqsetup } {
+  warichu_opening .code:n = {
+    \tl_set:Nn \l__jlreq_tmpa_tl {}
+    \str_set:Nx \l__jlreq_tmpa_str { \tl_to_str:n {#1} }
+    \str_set:Nx \l__jlreq_tmpa_str { \str_head:N \l__jlreq_tmpa_str }
+    \tl_map_inline:Nn \jlreq@charlist@openingbrackets {
+      \str_if_eq:eeT { \l__jlreq_tmpa_str } { \tl_to_str:n {##1} } {
+        \tl_set:Nn \l__jlreq_tmpa_tl { \jlreq@open@bracket@before@space }
+      }
+    }
+    \edef\jlreq@warichu@opening{\expandonce{\l__jlreq_tmpa_tl}\unexpanded{#1}}
+  },
+  warichu_closing .tl_set:N = \jlreq@warichu@closing
+}
+\keys_set:nn { jlreqsetup } { warichu_opening = {（}, warichu_closing = {）} }
 
 \def\jlreq@inlinenote@auto#1{%
   % 割注初め括弧の前の場所を保存
@@ -3772,11 +3824,11 @@
   % \jlreq@tempdimbに，現在行の残り長さを入れる
   \jlreq@tempdimb=\jlreq@rest@linewidth
   % 括弧の分を引いたものが，割注の使える長さ
-  \setbox\@tempboxa=\hbox{\jlreq@inlinenote@kakkofontsize\inhibitglue\jlreq@open@bracket@before@space（\inhibitglue}%
+  \setbox\@tempboxa=\hbox{\jlreq@inlinenote@kakkofontsize\inhibitglue\jlreq@warichu@opening\inhibitglue}%
   \addtolength{\jlreq@tempdimb}{-\wd\@tempboxa}%
   \ifdim\jlreq@tempdimb<0pt\jlreq@tempdimb=\linewidth\fi
   {%
-    \setbox\jlreq@tempboxa=\hbox{\jlreq@inlinenote@kakkofontsize\inhibitglue \jlreq@open@bracket@before@space（}%
+    \setbox\jlreq@tempboxa=\hbox{\jlreq@inlinenote@kakkofontsize\inhibitglue\jlreq@warichu@opening}%
     \jlreq@box@putcenter\jlreq@tempboxa
   }%
   % 「初回」時はここに強制改行を入れる．これにより現在位置の取得がより正しくなる……といいなぁ
@@ -3831,7 +3883,7 @@
     \splitmaxdepth=\maxdimen
     % 現在行の残り長さを思い出す
     \jlreq@tempdimb=\jlreq@rest@linewidth
-    \setbox\@tempboxa=\hbox{\jlreq@inlinenote@kakkofontsize\inhibitglue\jlreq@open@bracket@before@space（\inhibitglue}%
+    \setbox\@tempboxa=\hbox{\jlreq@inlinenote@kakkofontsize\inhibitglue\jlreq@warichu@opening\inhibitglue}%
     \addtolength{\jlreq@tempdimb}{-\wd\@tempboxa}%
     \setbox\@tempboxa=\box\jlreq@resultbox
     \@whilenum\@tempcnta<\jlreq@inlinenote@lines\do{%
@@ -3871,7 +3923,7 @@
 }
 
 \def\jlreq@inlinenote@noauto#1{%
-  \setbox\jlreq@tempboxa=\hbox{\jlreq@inlinenote@kakkofontsize\inhibitglue\jlreq@open@bracket@before@space（}%
+  \setbox\jlreq@tempboxa=\hbox{\jlreq@inlinenote@kakkofontsize\inhibitglue\jlreq@warichu@opening}%
   \inhibitglue\jlreq@box@putcenter\jlreq@tempboxa
   \jlreq@inlinenote@noauto@#1\\\jlreq@endmark\jlreq@endmark
   \jlreq@inlinenote@endnote
@@ -3909,7 +3961,7 @@
 \def\jlreq@inlinenote@endnote{%
   \jlreq@in@inlinenotefalse
   {%
-    \setbox\jlreq@tempboxa=\hbox{\jlreq@inlinenote@kakkofontsize）}%
+    \setbox\jlreq@tempboxa=\hbox{\jlreq@inlinenote@kakkofontsize\inhibitglue\jlreq@warichu@closing}%
     \jlreq@box@putcenter\jlreq@tempboxa
     \inhibitglue
   }%
@@ -4053,14 +4105,6 @@
   }%
 }
 
-% #1のleftとrightを入れ替えて#1に代入
-\def\jlreq@reverse@leftright#1{%
-  \str_case_e:nn {#1} {
-    { left  }{ \def#1{right} }
-    { right }{ \def#1{left}  }
-  }%
-}
-
 %.. マークの拡張
 \def\jlreq@markregistername#1{jlreq@extramark@register@#1}
 \def\jlreq@extraleftmark#1{\jlreq@extramark@{#1}{\expandafter\@firstoftwo\botmarks}}
@@ -4071,11 +4115,18 @@
 }
 \def\jlreq@extramark@@#1#2{#2#1\@empty\@empty}
 
-\def\jlreq@setextraleftmark@#1#2{{#2}{\expandafter\@secondoftwo#1}}
-\def\jlreq@setextrarightmark@#1#2{{\expandafter\@firstoftwo#1}{#2}}
-\def\jlreq@setextraleftmark#1#2{\jlreq@setextramark{#1}{#2}{\jlreq@setextraleftmark@}}
-\def\jlreq@setextrarightmark#1#2{\jlreq@setextramark{#1}{#2}{\jlreq@setextrarightmark@}}
-\def\jlreq@setextramark#1#2#3{%
+
+\def\jlreq@extramarkright#1#2{%
+  \jlreq@if{\ifcsname\jlreq@markregistername{#1}\endcsname\fi}{%
+    \expandafter\expandafter\expandafter\jlreq@extramarkright@\csname\jlreq@markregistername{#1}@themark\endcsname{#2}{#1}%
+  }{%
+    \jlreq@extramarkboth{#1}{}{#2}%
+  }%
+}
+\def\jlreq@extramarkright@#1#2#3#4{%
+  \jlreq@extramarkboth{#4}{#1}{#3}%
+}
+\def\jlreq@extramarkboth#1#2#3{
   \jlreq@if{\ifcsname\jlreq@markregistername{#1}\endcsname\fi}{}{%
     \expandafter\newmarks\csname\jlreq@markregistername{#1}\endcsname
     \expandafter\def\csname\jlreq@markregistername{#1}@themark\endcsname{{}{}}%
@@ -4084,305 +4135,667 @@
     \let\label\relax
     \let\index\relax
     \let\glossary\relax
-    \def\jlreq@@themark@csname{\jlreq@markregistername{#1}@themark}%
-    \expandafter\unrestored@protected@xdef\csname\jlreq@@themark@csname\endcsname{%
-      \expandafter#3\expandafter{\csname\jlreq@@themark@csname\endcsname}{#2}%
-    }%
-    \expandafter\expandafter\expandafter\@temptokena\expandafter\expandafter\expandafter{\csname\jlreq@@themark@csname\endcsname}%
+    \expandafter\unrestored@protected@xdef\csname\jlreq@markregistername{#1}@themark\endcsname{ {#2}{#3} }
+    \expandafter\expandafter\expandafter\@temptokena\expandafter\expandafter\expandafter{\csname\jlreq@markregistername{#1}@themark\endcsname}%
     \expandafter\marks\csname\jlreq@markregistername{#1}\endcsname{\the\@temptokena}%
   \endgroup
-  \if@nobreak\ifvmode\nobreak\fi\fi
+  \if@nobreak\ifvmode\nobreak\fi\fi  
 }
+
 \let\jlreq@markboth=\markboth
 \let\jlreq@markright=\markright
 
 %.. \DeclarePageStyle内で使うもの
-% mark情報の取得を行う．
-% #1の中身をみて，#2 = 何段目見出しか，#3 = odd/even，\csname #4@<見出し命令名>\endcsnameに必要情報を追加し，#5の見出し命令名リストに追加
-% #1@heading@levelにレベルを入れる
-\def\jlreq@pagestyle@setmark#1#2#3#4#5{%
-  \begingroup
-    \str_if_eq:eeTF {\str_head:N #1} {_} {
-      \str_if_eq:nnTF {#3} { odd } { \let\jlreq@leftright=r } { \let\jlreq@leftright=l }
-      \edef\jlreq@do{%
-        \unexpanded{\def#1}{%
-          \ifx l\jlreq@leftright
-            \int_compare:nTF { #2 = 0 } { \exp_not:N \leftmark } { \exp_not:n {\jlreq@extraleftmark{#2}} }
-          \else
-            \int_compare:nTF { #2 = 0 } { \exp_not:N \rightmark } { \exp_not:n {\jlreq@extrarightmark{#2}} }
-          \fi
-        }%
-      }%
-      \edef\jlreq@headingname{\expandafter\@gobble#1}% 見出し命令名
-      \edef\jlreq@tempa{\noexpand\@removeelement{\exp_not:o {\jlreq@headingname}}}%
-      \expandafter\jlreq@tempa\expandafter{#5}{#5}%
-      \@ifundefined{#4@\jlreq@headingname}{\expandafter\def\csname #4@\jlreq@headingname\endcsname{}}{}%
-      \tl_put_right:Nx \jlreq@do {%
-        \exp_not:N \@ifundefined {#4@\jlreq@headingname} { \exp_not:N \@namedef {#4@\jlreq@headingname} {} } {}
-        \noexpand\let\exp_not:c {\expandafter\@gobble\string #1@heading@level}=\exp_not:c {jlreq@heading@level@\jlreq@headingname}%
-        \exp_not:n {\def#5}{\exp_not:o {#5},\exp_not:o {\jlreq@headingname}}%
-        \exp_not:N \tl_put_right:Nn \exp_not:c {#4@\jlreq@headingname} {{{\int_compare:nT {#2=0} {#3}}{#2}{\ifx r\jlreq@leftright r\else l\fi}}}%
-      }%
-    }{\def\jlreq@do{}}%
-  \expandafter\endgroup
-  \jlreq@do
+%フォーマットを適用する．\def\@tempa##1{#3}して，\@tempa{#2}の結果を#1に返す．
+%#3が値なしだったら#4を使う．
+%#2: もと
+%#3: フォーマット
+%#4: デフォルトフォーマット
+\cs_set:Nn \__jlreq_pagestyle_applyformat:NnNN {
+  % #3が無効の時は，#2が空なら空にする．
+  \bool_if:nTF { \tl_if_empty_p:n {#2} && \tl_if_eq_p:NN #3 \c_novalue_tl } {
+    \tl_set:Nn #1 {#2}
+  }{
+    \group_begin:
+      \tl_set:Nx \l__jlreq_do_tl { \exp_not:n {\def\jlreq@tempa##1}{\tl_if_eq:NNTF #3 \c_novalue_tl {\exp_not:o #4}{\exp_not:o #3}} }
+      \l__jlreq_do_tl
+      \tl_set:Nx \l__jlreq_do_tl { \exp_not:n {\def#1} {\exp_not:o {\jlreq@tempa{#2}} } }
+    \exp_after:wN \group_end:
+    \l__jlreq_do_tl
+  }
 }
 
-% \def\<見出し>mark#1{...}というのを\jlreq@resultに入れる，
-% #1：*ならばextramarkを使う
-% #2: 見出し命令名，#3: mark_format
-% #4: {{mark_formatからさらに調べるやつ (odd|even)}{マークの何番目か．extraでない場合は0}{l or r(leftかrightか)}}の並び
-\def\jlreq@pagestyle@make@headingmark#1#2#3#4{%
-  \begingroup
-    \clist_map_variable:nNn {0,1,2} \jlreq@i {
-      \expandafter\def\csname jlreq@leftmark@\jlreq@i\endcsname{}%
-      \expandafter\def\csname jlreq@rightmark@\jlreq@i\endcsname{}%
-    }%
-    \jlreq@pagestyle@make@headingmark@{#2}{#3}#4\jlreq@endmark
-    \def\jlreq@do{}% とりあえず#1markの中身を入れていく
-    % leftを設定する時は対応するrightを空にする．
-    \expandafter\ifx\csname jlreq@leftmark@0\endcsname\@empty
-      \expandafter\ifx\csname jlreq@rightmark@0\endcsname\@empty\else
-        \tl_put_right:Nx \jlreq@do {
-          \jlreq@ifempty{#1}{\noexpand\markright}{\noexpand\jlreq@markright}{\exp_args:Nc \exp_not:o {jlreq@rightmark@0}}
-        }%
-      \fi
-    \else
-      \tl_put_right:Nx \jlreq@do {
-        \jlreq@ifempty{#1}{\noexpand\markboth}{\noexpand\jlreq@markboth}{\exp_args:Nc \exp_not:o {jlreq@leftmark@0}}{\exp_args:Nc \exp_not:o {jlreq@rightmark@0}}
-      }%
-    \fi
-    \clist_map_variable:nNn {1,2} \jlreq@i {
-      \expandafter\ifx\csname jlreq@leftmark@\jlreq@i\endcsname\@empty
-        \expandafter\ifx\csname jlreq@rightmark@\jlreq@i\endcsname\@empty\else
-          \tl_put_right:Nx \jlreq@do {\noexpand\jlreq@setextrarightmark{\jlreq@i}{\exp_args:Nc \exp_not:o {jlreq@rightmark@\jlreq@i}}}%
-        \fi
-      \else
-        \tl_put_right:Nx \jlreq@do{%
-          \noexpand\jlreq@setextraleftmark{\jlreq@i}{\exp_args:Nc \exp_not:o {jlreq@leftmark@\jlreq@i}}%
-          \noexpand\jlreq@setextrarightmark{\jlreq@i}{\exp_args:Nc \exp_not:o {jlreq@rightmark@\jlreq@i}}%
-        }%
-      \fi
-    }%
-    \ifx\jlreq@do\@empty\else
-      \edef\jlreq@do{%
-        \unexpanded{\edef\jlreq@result}{\noexpand\unexpanded{%
-          \noexpand\def\exp_not:c {#2mark}\unexpanded{##1}{%
-            \exp_not:o {\jlreq@do}%
-          }}%
-        }%
-      }%
-    \fi
-  \expandafter\endgroup
-  \jlreq@do
-}%
-\def\jlreq@pagestyle@make@headingmark@#1#2#3{%
-  \jlreq@ifendmark{#3}{}{\jlreq@pagestyle@make@headingmark@@{#1}{#2}#3}%
+\cs_generate_variant:Nn \__jlreq_pagestyle_applyformat:NnNN { NocN }
+
+% mark系の処理をする．
+% #2: 奇数ページ柱（prop，{0,1,2}->柱の中身）
+% #3: 偶数ページ柱（prop，{0,1,2}->柱の中身）
+% #4: mark format（prop，{(見出し名)}->フォーマット）
+% #2,#3の中身が見出し名ならば\leftmark/\rightmarkなどに書き換えられる．
+% #1（prop）に{<見出し名>}{\<見出し名>markの定義}を入れる
+\cs_set:Nn \__jlreq_pagestyle_makemarkcommand:NNNN {
+  \group_begin:
+    \tl_set:Nn \l__jlreq_do_tl { \prop_clear:N #1 }
+    \prop_clear:N \l__jlreq_tmpa_prop % markの定義を入れる．
+    \clist_map_inline:nn { 0,1,2 } {
+      \prop_clear:N \l__jlreq_tmpb_prop % \rightmarkになる\<見出し>markの定義を入れる
+      \prop_clear:N \l__jlreq_tmpc_prop % \leftmarkになる\<見出し>markの定義を入れる
+      \__jlreq_pagestyle_makemarkcommand_aux:NNNnnN \l__jlreq_tmpb_prop \l__jlreq_tmpa_tl #2 { odd  } { ##1 } #4
+      \tl_put_right:No \l__jlreq_do_tl \l__jlreq_tmpa_tl
+      \__jlreq_pagestyle_makemarkcommand_aux:NNNnnN \l__jlreq_tmpc_prop \l__jlreq_tmpa_tl #3 { even } { ##1 } #4
+      \tl_put_right:No \l__jlreq_do_tl \l__jlreq_tmpa_tl
+      \prop_map_inline:Nn \l__jlreq_tmpc_prop {
+        \prop_put:Nnx \l__jlreq_tmpa_prop {####1} {
+          \prop_item:Nn \l__jlreq_tmpa_prop {####1}
+          \int_compare:nNnTF { ##1 } = { 0 } { \exp_not:N \markboth } { \exp_not:N \jlreq@extramarkboth {##1} }
+            { \exp_not:n {####2} }
+            { \prop_item:Nn \l__jlreq_tmpb_prop {####1} }
+        }
+      }
+      \prop_map_inline:Nn \l__jlreq_tmpb_prop {
+        \prop_if_in:NnF \l__jlreq_tmpc_prop {####1} {
+          \prop_put:Nnx \l__jlreq_tmpa_prop {####1} {
+            \prop_item:Nn \l__jlreq_tmpa_prop {####1}
+            \int_compare:nNnTF { ##1 } = { 0 } { \exp_not:N \markright } { \exp_not:N \jlreq@extramarkright {##1} }
+              { \exp_not:n {####2} }
+          }
+        }
+      }
+    }
+    \prop_map_inline:Nn \l__jlreq_tmpa_prop {
+      \tl_put_right:Nx \l__jlreq_do_tl {
+        \exp_not:n { \prop_put:Nnn #1 {##1} } {
+          \exp_not:N \def \exp_not:o { \csname ##1mark\endcsname ####1 } { \exp_not:n {##2} }
+        }
+      }
+    }
+  \exp_after:wN \group_end:
+  \l__jlreq_do_tl
+}
+
+% mark処理サブ
+% #3: 柱（prop）
+% #4: odd or even
+% #5: 何番目か=0,1,2
+% #6: mark_format（prop）
+% #1（prop）にmark用のフォーマットを入れる．
+% キーは<見出し名>
+% #2に#3の中身を書き換えるコード（\prop_put:Nnn #3 {section}{\rightmark}のような）を入れる
+\cs_set:Nn \__jlreq_pagestyle_makemarkcommand_aux:NNNnnN {
+  \group_begin:
+    \tl_set:Nn \l__jlreq_do_tl { \tl_set:Nn #2 {} }
+    \prop_get:NnN #3 {#5} \l__jlreq_tmpa_tl
+%    \message{TL=\exp_not:o \l__jlreq_tmpa_tl}
+%    \str_set:NV \l__jlreq_tmpa_str \l__jlreq_tmpa_tl
+    \str_if_eq:eeT { \str_head:N \l__jlreq_tmpa_tl } {_} {
+      % 柱の書き換え
+      \str_if_eq:nnTF { #4 } { odd } {
+        \int_compare:nNnTF {#5}={0} {
+          \tl_put_right:Nx \l__jlreq_do_tl {
+            \exp_not:n { \tl_put_right:Nn #2 } { \exp_not:n { \prop_put:Nnn #3 } {#5} { \exp_not:N \rightmark } }
+          }
+        }{
+          \tl_put_right:Nx \l__jlreq_do_tl {
+            \exp_not:n { \tl_put_right:Nn #2 } { \exp_not:n { \prop_put:Nnn #3 } {#5} { \exp_not:n { \jlreq@extrarightmark{#5} } } }
+          }
+        }
+      }{
+        \int_compare:nNnTF {#5}={0} {
+          \tl_put_right:Nx \l__jlreq_do_tl {
+            \exp_not:n { \tl_put_right:Nn #2 } { \exp_not:n { \prop_put:Nnn #3 } {#5} { \exp_not:N \leftmark } }
+          }
+        }{
+          \tl_put_right:Nx \l__jlreq_do_tl {
+            \exp_not:n { \tl_put_right:Nn #2 } { \exp_not:n { \prop_put:Nnn #3 } {#5} { \exp_not:n { \jlreq@extraleftmark{#5} } } }
+          }
+        }
+      }
+      % 見出し名
+      \str_set:Nx \l__jlreq_tmpa_str {\exp_after:wN \use_none:n \l__jlreq_tmpa_tl }
+      % _<見出し名>優先でmark formatを取得して\l__jlreq_tmpb_tlに入れる．
+      \prop_get:NoNF #6 \l__jlreq_tmpa_tl \l__jlreq_tmpb_tl {
+        \prop_get:NnNF #6 {#4} \l__jlreq_tmpb_tl {
+          \tl_set:Nx \l__jlreq_tmpb_tl {
+            \exp_not:c {the\l__jlreq_tmpa_str}
+            \exp_not:N \ifx \exp_not:c {the\l__jlreq_tmpa_str} \exp_not:n {\@empty\else\protect\quad\fi}
+            \exp_not:n {##1}
+          }
+        }
+      }
+      \tl_put_right:Nx \l__jlreq_do_tl {
+        \exp_not:n { \prop_put:Nnn #1 } { \l__jlreq_tmpa_str } { \exp_not:o { \l__jlreq_tmpb_tl } }
+      }
+    }
+  \exp_after:wN \group_end:
+  \l__jlreq_do_tl
 }
 
-\def\jlreq@pagestyle@make@headingmark@@#1#2#3#4#5{%
-  % \jlreq@tempbに\***markの定義を入れる
-  \edef\jlreq@tempb{%
-    \exp_not:c {the#1}%
-    \noexpand\ifx\exp_not:c {the#1}\unexpanded{\@empty\else\protect\quad\fi}%
-    \unexpanded{##1}%
-  }%
-  \jlreq@parsekeyval@nokey{%
-    \tl_if_empty:nF {##1} {\str_if_eq:nnT {##1} {#3} {\edef\jlreq@tempb{\unexpanded{##2}}}}
-    \str_if_eq:nnT {##1} {_#1} {\edef\jlreq@tempb{\unexpanded{##2}}}%
-  }{#2}%
-  \ifx l#5%
-    \expandafter\edef\csname jlreq@leftmark@#4\endcsname{\exp_not:o {\jlreq@tempb}}%
-  \else
-    \expandafter\edef\csname jlreq@rightmark@#4\endcsname{\exp_not:o {\jlreq@tempb}}%
-  \fi
-  \jlreq@pagestyle@make@headingmark@{#1}{#2}%
+% \prop_item:Nn #1 {#2}が_***だったら***に，そうでなければ空に展開される．
+\cs_set:Nn \__jlreq_pagestyle_get_runninghead_section:Nn {
+  \exp_args:Ne \__jlreq_pagestyle_get_runninghead_section_aux:n { \prop_item:Nn #1 {#2} }
 }
 
-% #2 #3 #4と並んだヘッダを作り#1に入れる．#1，#2，#3はコンロトールシークエンスの名前とする．
-\def\jlreq@pagestyle@setheadfoot#1#2#3#4{%
-  \begingroup
-    \edef\jlreq@do{\noexpand\jlreq@pagestyle@setheadfoot@{\unexpanded{#1}}{\exp_args:Nc \exp_not:o {#2}}{\exp_args:Nc \exp_not:o {#3}}{\exp_args:Nc \exp_not:o {#4}}}%
-  \expandafter\endgroup
-  \jlreq@do
+\cs_set:Nn \__jlreq_pagestyle_get_runninghead_section_aux:n {
+  \str_if_eq:eeTF { \str_head:n {#1} } {_} { \exp_not:o {\use_none:n #1} } {}
 }
 
-% \edef内だと，#1 != 0ptならば\hskip \dimexpr#1\relaxになる
-\def\jlreq@pagestyle@hskip#1{%
-  \dim_compare:nF { #1 = 0pt }{\noexpand\hskip\noexpand\dimexpr#1\noexpand\relax}%
+%#1: 位置情報がleft-topのように入っているもの，prop
+%#2: デフォルト
+%#1の中身を書き換えて返す．
+\cs_set:Nn \__jlreq_pagestyle_normalizeposition:Nn {
+  \group_begin:
+    \tl_set:Nn \l__jlreq_do_tl {}
+    \tl_clear:N \l__jlreq_tmpa_tl % デフォルト位置
+    \tl_set:Nx \l__jlreq_tmpa_tl { \prop_item:Nn #1 {0} }
+    \exp_args:No \jlreq@pagestyle@parse@position \l__jlreq_tmpa_tl \l__jlreq_tmpa_tl {#2}
+    \prop_map_inline:Nn #1 {
+      \exp_args:Nnno \jlreq@pagestyle@parse@position {##2} \l__jlreq_tmpb_tl \l__jlreq_tmpa_tl
+      \tl_put_right:Nx \l__jlreq_do_tl {
+        \exp_not:n { \prop_put:Nnn #1 {##1} } {\exp_not:o {\l__jlreq_tmpb_tl} }
+      }
+    }
+  \exp_after:wN \group_end:
+  \l__jlreq_do_tl
 }
-\def\jlreq@pagestyle@setheadfoot@#1#2#3#4{%
-  \begingroup
-    % - \Cdpは端にそろえるための補正
-    \jlreq@ifempty{#2}{\def\jlreq@left{}}{\edef\jlreq@left{\jlreq@pagestyle@hskip{\jlreq@expand@speciallength{\jlreq@headfoot@sidemargin}\if@tate - \Cdp\fi}\unexpanded{#2}}}%
-    % +\topskip - \Chtは\jlreq@headfoot@sidemargin = 0ptの時に本文の右に一致させるための補正．
-    \jlreq@ifempty{#4}{\def\jlreq@right{}}{\edef\jlreq@right{\unexpanded{#4}\jlreq@pagestyle@hskip{\jlreq@expand@speciallength{\jlreq@headfoot@sidemargin}\if@tate + \topskip - \Cht\fi}}}%
-    \jlreq@ifempty{#3}{%
-      \edef\jlreq@do{\unexpanded{\def#1}{\exp_not:o {\jlreq@left}\hfil\exp_not:o {\jlreq@right}}}%
-      \jlreq@ifempty{#2}{\jlreq@ifempty{#4}{\def\jlreq@do{\def#1{}}}{}}{}%
-    }{% #3を完全に真ん中に配置するために左右の幅を0にしておく
-      \ifx\jlreq@left\@empty\else\edef\jlreq@left{\noexpand\hbox to 0pt{\exp_not:o {\jlreq@left}\noexpand\hss}}\fi
-      \ifx\jlreq@right\@empty\else\edef\jlreq@right{\noexpand\hbox to 0pt{\noexpand\hss\exp_not:o {\jlreq@right}}}\fi
-      \edef\jlreq@do{%
-        \unexpanded{\def#1}{\exp_not:o {\jlreq@left}\hfil\unexpanded{#3}\hfil\exp_not:o {\jlreq@right}}%
-      }%
-    }%
-  \expandafter\endgroup
-  \jlreq@do
-}%
 
-% #1の左右に傍注調整用の空白を入れて#1に代入する
-\def\jlreq@pagestyle@addsidenotemargin@left#1{%
-  \jlreq@pagestyle@addsidenotemargin@{#1}{\jlreq@sidenote@length + \jlreq@sidenote@sep}{}%
+%#2: 柱
+%#3: フォント
+%#4: 位置
+%#5: 空き
+%#1に返す
+\cs_set:Nn \__jlreq_pagestyle_maketate_runhead:NNNNn {
+  \group_begin:
+    \tl_set:Nn \l__jlreq_result_tl {}
+    \__jlreq_pagestyle_maketate_rearrange:NNNNn \l__jlreq_tmpa_seq #2 #3 #4 {#5}
+    \seq_map_inline:Nn \l__jlreq_tmpa_seq {
+      \tl_set:Nx \l__jlreq_tmpa_tl { \exp_args:No \exp_not:n {\use_i:nn ##1} } % 場所
+      \tl_set:Nx \l__jlreq_tmpb_tl { \exp_args:No \exp_not:n {\use_ii:nn ##1} } % 中身
+      \tl_put_right:Nx \l__jlreq_result_tl {
+        \exp_not:N \hbox to~0pt {
+          \exp_not:n {\hskip\glueexpr\headsep + \headheight}
+          \legacy_if:nF { @tate } { \exp_not:n {+ \topskip - \Cht} }
+          \tl_if_empty:oF \l__jlreq_tmpa_tl { + \exp_not:o \l__jlreq_tmpa_tl } \exp_not:N \relax
+          \exp_not:o \l__jlreq_tmpb_tl
+          \exp_not:N \hss
+        }
+      }
+    }
+    \tl_set:Nx \l__jlreq_do_tl { \exp_not:n { \tl_set:Nn #1 } { \exp_not:o \l__jlreq_result_tl } }
+  \exp_after:wN \group_end:
+  \l__jlreq_do_tl
 }
-\def\jlreq@pagestyle@addsidenotemargin@right#1{%
-  \jlreq@pagestyle@addsidenotemargin@{#1}{}{\jlreq@sidenote@length + \jlreq@sidenote@sep}%
+\cs_generate_variant:Nn \__jlreq_pagestyle_maketate_runhead:NNNNn { NcNNo }
+
+%#2: ノンブル
+%#3: フォント
+%#4: 位置
+%#5: 空き
+%#1に返す
+\cs_set:Nn \__jlreq_pagestyle_maketate_nombre:NNNNn {
+  \group_begin:
+    \tl_set:Nn \l__jlreq_result_tl {}
+    \__jlreq_pagestyle_maketate_rearrange:NNNNn \l__jlreq_tmpa_seq #2 #3 #4 {#5}
+    \seq_map_inline:Nn \l__jlreq_tmpa_seq {
+      \tl_set:Nx \l__jlreq_tmpa_tl { \exp_args:No \exp_not:n {\use_i:nn ##1} } % 場所
+      \tl_set:Nx \l__jlreq_tmpb_tl { \exp_args:No \exp_not:n {\use_ii:nn ##1} } % 中身
+      \tl_put_right:Nx \l__jlreq_result_tl {
+        \exp_not:N \hbox to~0pt {
+          \exp_not:N \hss
+          \exp_not:o \l__jlreq_tmpb_tl
+          \tl_if_empty:oF \l__jlreq_tmpa_tl {
+            \exp_not:n { \hskip\glueexpr } \exp_not:o \l__jlreq_tmpa_tl \exp_not:N \relax
+          }
+        }
+      }
+    }
+    \tl_set:Nx \l__jlreq_do_tl { \exp_not:n { \tl_set:Nn #1 } { \exp_not:o \l__jlreq_result_tl } }
+  \exp_after:wN \group_end:
+  \l__jlreq_do_tl
+}
+\cs_generate_variant:Nn \__jlreq_pagestyle_maketate_nombre:NNNNn { NNNNo }
+
+%#2: 中身
+%#3: フォント
+%#4: 位置
+%#5: 空き
+% tate指定のページスタイルの時は，空き指定は
+% (1)なければ前のやつに続いて
+% (2)あれば絶対的な位置指定
+% となる．この関数で，(1)によってまとまるものを一つにまとめて，seqにして返す．
+% #1に{空き}{トークン列}のseqを返す．
+\cs_set:Nn \__jlreq_pagestyle_maketate_rearrange:NNNNn {
+  \group_begin:
+    \tl_set:Nn \l__jlreq_do_tl { \seq_clear:N #1 }
+    \tl_set:Nn \l__jlreq_tmpa_tl {} % 現在処理中
+    \tl_set:Nn \l__jlreq_tmpc_tl {} % 現在の位置
+    \clist_map_inline:nn {0,1,2} {
+      \tl_set:Nx \l__jlreq_tmpb_tl { \prop_item:Nn #2 {##1} }
+      \tl_if_empty:oF \l__jlreq_tmpb_tl {
+        \tl_set:Nx \l__jlreq_tmpb_tl { \prop_item:Nn #4 {##1} } % pos
+        \tl_if_empty:NTF \l__jlreq_tmpb_tl { % pos = empty
+          \tl_put_right:Nx \l__jlreq_tmpa_tl {
+            \tl_if_empty:NF \l__jlreq_tmpa_tl { \exp_not:n { \hskip\glueexpr #5\relax } }
+          }
+        }{
+          \tl_if_empty:oF \l__jlreq_tmpa_tl {
+            \tl_put_right:Nx \l__jlreq_do_tl {
+              \exp_not:n { \seq_put_right:Nn #1 } {
+                { \exp_not:o \l__jlreq_tmpc_tl } { \exp_not:o \l__jlreq_tmpa_tl }
+              }
+            }
+            \tl_set:Nn \l__jlreq_tmpa_tl {}
+          }
+        }
+        \tl_if_empty:oT \l__jlreq_tmpa_tl { \tl_set:Nx \l__jlreq_tmpc_tl { \prop_item:Nn #4 { ##1 } } }
+        \tl_set:Nx \l__jlreq_tmpb_tl { \prop_item:Nn #3 {##1} }
+        \tl_put_right:Nx \l__jlreq_tmpa_tl {
+          \tl_if_empty:NTF \l__jlreq_tmpb_tl 
+            { \prop_item:Nn #2 {##1} }
+            { { \exp_not:o \l__jlreq_tmpb_tl \prop_item:Nn #2 {##1} } }
+        }
+      }
+    }
+    \tl_if_empty:oF \l__jlreq_tmpa_tl {
+      \tl_put_right:Nx \l__jlreq_do_tl {
+        \exp_not:n { \seq_put_right:Nn #1 } { { \exp_not:o \l__jlreq_tmpc_tl } { \exp_not:o \l__jlreq_tmpa_tl } }
+      }
+    }
+  \exp_after:wN \group_end:
+  \l__jlreq_do_tl
 }
-\def\jlreq@pagestyle@addsidenotemargin@bothside#1{%
-  \jlreq@pagestyle@addsidenotemargin@{#1}{\jlreq@sidenote@length + \jlreq@sidenote@sep}{\jlreq@sidenote@length + \jlreq@sidenote@sep}%
+
+
+%#2: odd/even
+%#3: 位置
+%#2 = evenならば位置を反転させて#1 = strに返す．
+\cs_set:Nn \__jlreq_pagestyle_reversepos_ifeven:Nnn {
+  \str_set:Nn #1 {#3}
+  \str_if_eq:nnT {#2} {even} {
+    \str_if_eq:nnT {#3} {right} { \str_set:Nn #1 {left}  }
+    \str_if_eq:nnT {#3} {left}  { \str_set:Nn #1 {right} }
+  }
 }
-% #2: 左，#3：右，#4：#2 + #3
-\def\jlreq@pagestyle@addsidenotemargin@#1#2#3{%
-  \ifx#1\@empty\else
-    \edef#1{%
-      \jlreq@ifempty{#2}{}{\unexpanded{\hskip-\dimexpr #2\relax}}%
-      \exp_not:o {#1}%
-      \jlreq@ifempty{#3}{}{\unexpanded{\hskip-\dimexpr #3\relax}}%
-    }%
-  \fi
+
+% 各場所（六カ所），柱 or ノンブルのトークン列を作る．#1に返す
+%#2: odd/even
+%#3: 縦方向場所（top/bottom）
+%#4: 横方向場所（left/right/center）
+%#5: 中身（柱 or ノンブル，prop）
+%#6: フォント（prop）
+%#7: 場所（prop）
+%#8: 空き
+\cs_set:Nn \__jlreq_pagestyle_makeyoko_each:NnnnNNNn {
+  \group_begin:
+    \__jlreq_pagestyle_makeyoko_sequence:NnnNNN \l__jlreq_tmpa_seq {#3} {#4} #5 #6 #7
+    \__jlreq_pagestyle_reversepos_ifeven:Nnn \l__jlreq_tmpa_str {#2} {#4}
+    \__jlreq_pagestyle_makeyoko_concat_withspaces:NVNn \l__jlreq_tmpa_tl \l__jlreq_tmpa_str \l__jlreq_tmpa_seq {#8}
+    \tl_set:Nx \l__jlreq_do_tl { \exp_not:n { \tl_set:Nn #1 } { \exp_not:o \l__jlreq_tmpa_tl } }
+  \exp_after:wN \group_end:
+  \l__jlreq_do_tl
 }
+\cs_generate_variant:Nn \__jlreq_pagestyle_makeyoko_each:NnnnNNNn { NnnncNNo }
 
-% #1が空かつ#4が空でないならば#2に#3と#4の中身を追加し，#4を空にする．引数は全てコントロールシークエンス
-\def\jlreq@pagestyle@addifempty#1#2#3#4{%
-  \ifx#1\@empty\ifx#4\@empty\else\tl_put_right:Nx #2{ \exp_not:o {#3}\exp_not:o {#4} }\def#4{}\fi\fi
+%#2: 縦方向場所（top/bottom）
+%#3: 横方向場所（left/right/center）
+%#4: 中身（柱 or ノンブル，prop）
+%#5: フォント（prop）
+%#6: 場所（prop）
+%#1に左から{フォント}{中身}を並べた配列を返す．
+\cs_set:Nn \__jlreq_pagestyle_makeyoko_sequence:NnnNNN {
+  \group_begin:
+    \tl_set:Nn \l__jlreq_do_tl { \seq_clear:N #1 }
+    \clist_map_inline:nn {0,1,2} {
+      \tl_set:Nx \l__jlreq_tmpa_tl { \prop_item:Nn #4 {##1} }
+      \tl_if_empty:NF \l__jlreq_tmpa_tl {
+        \exp_args:Nxx \tl_if_eq:nnT {{#2}{#3}} { \prop_item:Nn #6 {##1} } {
+          \tl_put_right:Nx \l__jlreq_do_tl {
+            \exp_not:n { \seq_put_right:Nn #1 } { {\prop_item:Nn #5 {##1}}{\exp_not:o \l__jlreq_tmpa_tl} }
+          }
+        }
+      }
+    }
+  \exp_after:wN \group_end:
+  \l__jlreq_do_tl
 }
 
-\newif\ifjlreq@PageStyle@first
-% #1に入っている{柱1}{柱2}...{柱n}という並びから，実際に出力する柱を構築する．n>=1を仮定する．
-% 間に空白を入れる．
-% #1: ターゲットなコントロールシークエンスの名前，#2：*ならばreverseする，#3：空き
-\def\jlreq@pagestyle@make@runninghead#1#2#3{%
-  \jlreq@if{\expandafter\ifx\csname #1\endcsname\@empty\fi}{}{%
-    \edef\jlreq@do{%
-      \noexpand\jlreq@tempatrue % 最初の処理かフラグ
-      \unexpanded{\jlreq@pagestyle@make@runninghead@{#1}{#2}{#3}}\exp_args:Nc \exp_not:o {#1}\noexpand\jlreq@endmark
-    }%
-    \expandafter\def\csname #1\endcsname{}%
-    \jlreq@do
-    % 項目が二つ以上あった．
-    \ifjlreq@tempa\else\tl_put_left:cn {#1} {\jlreq@PageStyle@firsttrue} \fi
-  }%
+% 各場所（左，真ん中，右）のヘッダのトークン列を作る
+%#2: 横方向場所
+%#3: {フォント}{中身}の配列
+%#4: スペース
+%#1に結果のトークン列を入れる
+\cs_set:Nn \__jlreq_pagestyle_makeyoko_concat_withspaces:NnNn {
+  \seq_if_empty:NTF #3 {
+    \tl_set:Nn #1 {}
+  }{
+    \str_if_eq:nnTF {#2}{right}{
+      \__jlreq_pagestyle_concat_withspaces_right:NNn #1 #3 {#4}
+    }{
+      \__jlreq_pagestyle_concat_withspaces_left:NNn #1 #3 {#4}
+    }
+  }
 }
-\def\jlreq@pagestyle@make@runninghead@#1#2#3#4#5{%
-  \jlreq@if{\ifnum\numexpr\jlreq@ifendmark{#5}{1}{0}*\ifjlreq@tempa 1\else 0\fi\relax=1~\fi}{%
-    % 項目が一つしか無い
-    \jlreq@ifempty{#2}{\tl_put_right:cn}{\tl_put_left:cn}{#1}{#4}%
-  }{%
-    % 最初の空でない柱に出会うまでは柱の間の空白を入れない．
-    % 空でない柱に出会ってないならば\ifjlreq@PageStyle@firstはtrue．
-    % 一番最初の\jlreq@PageStyle@firsttrueは後で入れる．
-    \jlreq@ifempty{#2}{\tl_put_right:cn}{\tl_put_left:cn}{#1}{%
-      \protected@edef\jlreq@tempa{#4}%
-      \ifx\jlreq@tempa\@empty\else
-        \ifjlreq@PageStyle@first\else\hskip\glueexpr#3\relax\fi
-        \jlreq@tempa
-        \jlreq@PageStyle@firstfalse
-      \fi
-    }%
-    \jlreq@tempafalse
-    \jlreq@ifendmark{#5}{}{\jlreq@pagestyle@make@runninghead@{#1}{#2}{#3}{#5}}%
-  }%
+\cs_generate_variant:Nn \__jlreq_pagestyle_makeyoko_concat_withspaces:NnNn { NVNn }
+
+%#2: {フォント}{中身}の配列
+%#3: スペース
+%#1に結果のトークン列を入れる
+\cs_set:Nn \__jlreq_pagestyle_concat_withspaces_left:NNn {
+  \group_begin:
+    \tl_set:Nn \l__jlreq_reuslt_tl {}
+    \seq_pop_right:NN #2 \l__jlreq_tmpc_tl % 最後の項目
+    \seq_map_inline:Nn #2 {
+      \tl_set:Nx \l__jlreq_tmpa_tl { \exp_args:No \exp_not:n {\use_i:nn ##1} }
+      \tl_set:Nx \l__jlreq_tmpb_tl { \exp_args:No \exp_not:n {\use_ii:nn ##1} }
+      \tl_put_right:Nx \l__jlreq_result_tl {
+        \exp_not:n {\setbox\@tempboxa=\hbox}
+          { \tl_if_empty:NTF \l__jlreq_tmpa_tl {\exp_not:o \l__jlreq_tmpb_tl}{\exp_not:o \l__jlreq_tmpa_tl \exp_not:N \l__jlreq_tmpb_tl} }
+        \exp_not:n { \copy\@tempboxa }
+        \exp_not:n { 
+          \ifnum0
+            \ifdim\wd\@tempboxa=0pt~\else 1\fi
+            \ifdim\ht\@tempboxa=0pt~\else 1\fi
+            \ifdim\dp\@tempboxa=0pt~\else 1\fi
+          >0~\hskip\glueexpr #3\relax\fi
+        }
+      }
+    }
+    \cs_set:Nn \l__jlreq_tmpa:nn {
+      \tl_if_empty:nTF{##1} { \exp_not:n {##2} }{ \exp_not:n {{##1##2}} }
+    }
+    \tl_put_right:Nx \l__jlreq_result_tl {\exp_after:wN \l__jlreq_tmpa:nn \l__jlreq_tmpc_tl}
+    \tl_set:Nx \l__jlreq_do_tl {
+      \exp_not:n { \tl_set:Nn #1} {\exp_not:o \l__jlreq_result_tl}
+    }
+  \exp_after:wN \group_end:
+  \l__jlreq_do_tl
 }
 
-% #1= cs，#2 = フォーマットの入ったcs，#3 = デフォルトフォーマットの入ったcs
-\def\jlreq@pagestyle@applyformat#1#2#3{%
-  % デフォルト時に限り，\hbox to ***{空トークン}を避ける
-  \ifnum 0\ifx#1\@empty\else 1\fi\ifx#2\relax\else 1\fi>0
-    \edef\jlreq@do{\unexpanded{\def\jlreq@tempa##1}{\ifx#2\relax\exp_not:o {#3}\else\exp_not:o {#2}\fi}}\jlreq@do
-    \edef#1{\expandafter\exp_not:o \expandafter{\expandafter\jlreq@tempa\expandafter{#1}}}%
-  \fi
+%#2: {フォント}{中身}の配列
+%#3: スペース
+%#1に結果のトークン列を入れる
+\cs_set:Nn \__jlreq_pagestyle_concat_withspaces_right:NNn {
+  \group_begin:
+    \tl_set:Nn \l__jlreq_result_tl {}
+    \bool_set_true:N \l__jlreq_tmpa_bool % 最初か
+    \seq_map_inline:Nn #2 {
+      \tl_set:Nx \l__jlreq_tmpa_tl { \exp_args:No \exp_not:n {\use_i:nn ##1} }
+      \tl_set:Nx \l__jlreq_tmpb_tl { \exp_args:No \exp_not:n {\use_ii:nn ##1} }
+      \bool_if:NTF \l__jlreq_tmpa_bool {
+        \tl_put_right:Nx \l__jlreq_result_tl {
+          \tl_if_empty:NTF \l__jlreq_tmpa_tl {\exp_not:o \l__jlreq_tmpb_tl}{{\exp_not:o \l__jlreq_tmpa_tl \exp_not:o \l__jlreq_tmpb_tl}}
+        }
+      }{
+        \tl_put_right:Nx \l__jlreq_result_tl {
+          \exp_not:n { \setbox\@tempboxa=\hbox}
+            { \tl_if_empty:NTF \l__jlreq_tmpa_tl {\exp_not:o \l__jlreq_tmpb_tl }{\exp_not:o \l__jlreq_tmpa_tl \exp_not:o \l__jlreq_tmpb_tl} }
+          \exp_not:n { 
+            \ifnum0
+              \ifdim\wd\@tempboxa=0pt~\else 1\fi
+              \ifdim\ht\@tempboxa=0pt~\else 1\fi
+              \ifdim\dp\@tempboxa=0pt~\else 1\fi
+            >0~\hskip\glueexpr #3\relax\fi
+          }
+          \exp_not:n { \box\@tempboxa }
+        }
+      }
+      \bool_set_false:N \l__jlreq_tmpa_bool
+    }
+    \tl_set:Nx \l__jlreq_do_tl { \exp_not:n { \tl_set:Nn #1} {\exp_not:o \l__jlreq_result_tl} }
+  \exp_after:wN \group_end:
+  \l__jlreq_do_tl
 }
+\cs_generate_variant:Nn \__jlreq_pagestyle_concat_withspaces_right:NnN {NoN}
 
-% フォント情報を追加する．#1：制御綴り名，#2：フォント命令の入っている制御綴名，#1に返す
-\def\jlreq@pagestyle@addfont@tocs#1#2{%
-  \expandafter\ifx\csname #1\endcsname\@empty\else
-    \expandafter\ifx\csname #2\endcsname\@empty\else
-      \expandafter\edef\csname #1\endcsname{{\exp_args:Nc \exp_not:o {#2}\exp_args:Nc \exp_not:o {#1}}}%
-    \fi
-  \fi
+
+%#2: odd or even（even時は左右をひっくり返して処理される）
+%#3: 左
+%#4: 真ん中
+%#5: 右
+% #1に返す．
+\cs_set:Nn \__jlreq_pagestyle_concat_left_center_right:Nnnnn {
+  \str_if_eq:nnTF {#2} {odd} {
+    \__jlreq_pagestyle_concat_left_center_right_aux:Nnnn #1 {#3} {#4} {#5}
+  }{
+    % evenでは左右入れ替え
+    \__jlreq_pagestyle_concat_left_center_right_aux:Nnnn #1 {#5} {#4} {#3}
+  }
 }
-% こちらは#1にトークン列を与える．\edefで展開される．制御綴名#3に代入．
-\def\jlreq@pagestyle@addfont@totokens#1#2#3{%
-  \begingroup
-    \edef\jlreq@do{\noexpand\edef\exp_not:c {#3}{\unexpanded{#1}}}%
-    \expandafter\ifx\csname #2\endcsname\@empty\else
-      \edef\jlreq@tempa{#1}%
-      \ifx\jlreq@tempa\@empty\else
-        \edef\jlreq@do{%
-          \noexpand\edef\exp_not:c {#3}{\noexpand\unexpanded{%
-            {\exp_args:Nc \exp_not:o {#2}\exp_not:o {\jlreq@tempa}}%
-          }}%
-        }%
-      \fi
-    \fi
-  \expandafter\endgroup
-  \jlreq@do
+
+\cs_generate_variant:Nn \__jlreq_pagestyle_concat_left_center_right:Nnnnn { Nneee }
+
+% #2: 左，#3: 真ん中，#4: 右をくっつける
+% #1に返す
+\cs_set:Nn \__jlreq_pagestyle_concat_left_center_right_aux:Nnnn {
+  \group_begin:
+    \tl_set:Nn \l__jlreq_tmpa_tl {} % 左
+    \tl_set:Nn \l__jlreq_tmpb_tl {} % 右
+    \tl_set:Nn \l__jlreq_tmpc_tl {} % 戻り値
+    \tl_if_empty:nF {#2} {
+      \bool_if:nT { ( !\dim_compare_p:nNn {\jlreq@headfoot@sidemargin}={0pt} ) || \legacy_if_p:n {@tate} }{
+        \tl_set:Nx \l__jlreq_tmpa_tl { \exp_not:n {\hskip\dimexpr} \jlreq@expand@speciallength{\jlreq@headfoot@sidemargin} \legacy_if:nT { @tate } { \exp_not:n { -\Cdp } } \exp_not:N \relax }
+      }
+      \tl_put_right:Nn \l__jlreq_tmpa_tl {#2}
+    }
+    \tl_if_empty:nF {#4} {
+      \tl_set:Nn \l__jlreq_tmpb_tl {#4}
+      % \jlreq@headfoot@sidemargin = 0ptの時に本文の右に一致させるための補正．
+      \bool_if:nT { ( !\dim_compare_p:nNn {\jlreq@headfoot@sidemargin}={0pt} ) || \legacy_if_p:n {@tate} }{
+        \tl_put_right:Nx \l__jlreq_tmpb_tl { \exp_not:n {\hskip\dimexpr} \jlreq@expand@speciallength{\jlreq@headfoot@sidemargin} \legacy_if:nT { @tate } { \exp_not:n { + \topskip - \Cht } } \exp_not:N \relax }
+      }
+    }
+    \tl_if_empty:nTF {#3} {
+      \bool_if:nF { \tl_if_empty_p:n {#2} && \tl_if_empty_p:n {#4} } {
+        \tl_set:Nx \l__jlreq_tmpc_tl { \exp_not:o \l__jlreq_tmpa_tl \exp_not:N \hfil \exp_not:o \l__jlreq_tmpb_tl }
+      }
+    }{
+      % 真ん中のを完全に真ん中に配置するために左右の幅を0にしておく
+      \tl_if_empty:nF { #2 } { \tl_set:Nx \l__jlreq_tmpa_tl { \exp_not:N \hbox to~0pt { \exp_not:o { \l__jlreq_tmpa_tl } \exp_not:N \hss } } }
+      \tl_if_empty:nF { #4 } { \tl_set:Nx \l__jlreq_tmpb_tl { \exp_not:N \hbox to~0pt { \exp_not:o { \l__jlreq_tmpb_tl } \exp_not:N \hss } } }
+      \tl_set:Nx \l__jlreq_tmpc_tl {
+        \exp_not:o \l__jlreq_tmpa_tl\exp_not:N \hfil \exp_not:n {#3} \exp_not:N \hfil \exp_not:o \l__jlreq_tmpb_tl
+      }
+    }
+    \tl_set:Nx \l__jlreq_do_tl { \exp_not:n {\tl_set:Nn #1 } { \exp_not:o \l__jlreq_tmpc_tl } }
+  \exp_after:wN \group_end:
+  \l__jlreq_do_tl
+}
+
+%#2: 横方向位置
+%#3: odd/even
+%#4: 柱
+%#5: ヘッダ
+%#6: 空き
+%#1 に戻す
+\cs_set:Nn \__jlreq_pagestyle_concat_runhead_nombre:Nnnnnn {
+  \tl_if_empty:nTF {#4} {
+    \tl_set:Nn #1 {#5}
+  }{
+    \tl_if_empty:nTF {#5} {
+      \tl_set:Nn #1 {#4}
+    }{
+      \group_begin:
+        \__jlreq_pagestyle_reversepos_ifeven:Nnn \l__jlreq_tmpa_str {#3} {#2}
+        \jlreq@ifleftpage{#3}{
+          \str_if_eq:VnTF \l__jlreq_tmpa_str {right} {
+            \tl_set:Nn \l__jlreq_do_tl {
+              \__jlreq_pagestyle_concat_runhead_nombre_aux_leftpage_right:Nnnn #1 {#4} {#5} {#6}
+            }
+          }{
+            \tl_set:Nn \l__jlreq_do_tl {
+              \__jlreq_pagestyle_concat_runhead_nombre_aux_leftpage_left:Nnnn #1 {#4} {#5} {#6}
+            }
+          }
+        }{
+          \str_if_eq:VnTF \l__jlreq_tmpa_str {left} {
+            \tl_set:Nn \l__jlreq_do_tl {
+              \__jlreq_pagestyle_concat_runhead_nombre_aux_rightpage_left:Nnnn #1 {#4} {#5} {#6}
+            }
+          }{
+            \tl_set:Nn \l__jlreq_do_tl {
+              \__jlreq_pagestyle_concat_runhead_nombre_aux_rightpage_right:Nnnn #1 {#4} {#5} {#6}
+            }
+          }
+        }
+      \exp_after:wN \group_end:
+      \l__jlreq_do_tl
+    }
+  }
+}
+\cs_generate_variant:Nn \__jlreq_pagestyle_concat_runhead_nombre:Nnnnnn { Nnnooo }
+
+% <ノンブル><空き><柱>，左寄せ，ノンブルは常に空でないと仮定する．
+\cs_set:Nn \__jlreq_pagestyle_concat_runhead_nombre_aux_leftpage_left:Nnnn {
+  \tl_set:Nn #1 {
+    #3\hskip\glueexpr #4\relax#2
+  }
+}
+% <ノンブル><空き><柱>，右寄せ
+\cs_set:Nn \__jlreq_pagestyle_concat_runhead_nombre_aux_leftpage_right:Nnnn {
+  \tl_set:Nn #1 {
+    \setbox\jlreq@PageStyle@box=\hbox{#2}
+    #3
+    \ifnum 0
+      \ifdim\wd\jlreq@PageStyle@box=0pt~\else 1\fi
+      \ifdim\ht\jlreq@PageStyle@box=0pt~\else 1\fi
+      \ifdim\dp\jlreq@PageStyle@box=0pt~\else 1\fi
+    >0~\hskip\glueexpr #4\relax\fi
+    \box\jlreq@PageStyle@box
+  }
+}
+% <柱><空き><ノンブル>，左寄せ
+\cs_set:Nn \__jlreq_pagestyle_concat_runhead_nombre_aux_rightpage_left:Nnnn {
+  \tl_set:Nn #1 {
+    \setbox\jlreq@PageStyle@box=\hbox{#2}
+    \copy\jlreq@PageStyle@box
+    \ifnum 0
+      \ifdim\wd\jlreq@PageStyle@box=0pt~\else 1\fi
+      \ifdim\ht\jlreq@PageStyle@box=0pt~\else 1\fi
+      \ifdim\dp\jlreq@PageStyle@box=0pt~\else 1\fi
+    >0~\hskip\glueexpr #4\relax\fi
+    #3
+  }
+}
+% <柱><空き><ノンブル>，右寄せ
+\cs_set:Nn \__jlreq_pagestyle_concat_runhead_nombre_aux_rightpage_right:Nnnn {
+  \tl_set:Nn #1 {
+    #2\hskip\glueexpr #4\relax#3
+  }
 }
 
+% #1の左右に傍注調整用の空白を入れて#1に代入する
+\cs_set:Nn \__jlreq_pagestyle_addsidenotemargin_left:N {
+  \__jlreq_pagestyle_addsidenotemargin_aux:Nnn #1 {\jlreq@sidenote@length + \jlreq@sidenote@sep} {}
+}
+\cs_set:Nn \__jlreq_pagestyle_addsidenotemargin_right:N {
+  \__jlreq_pagestyle_addsidenotemargin_aux:Nnn #1 {} {\jlreq@sidenote@length + \jlreq@sidenote@sep}
+}
+\cs_set:Nn \__jlreq_pagestyle_addsidenotemargin_bothside:N {
+  \__jlreq_pagestyle_addsidenotemargin_aux:Nnn #1 {\jlreq@sidenote@length + \jlreq@sidenote@sep} {\jlreq@sidenote@length + \jlreq@sidenote@sep}
+}
+% #2: 左，#3：右，#4：#2 + #3
+\cs_set:Nn \__jlreq_pagestyle_addsidenotemargin_aux:Nnn {
+  \tl_if_empty:NF #1 {
+    \tl_set:Nx #1 {
+      \tl_if_empty:nF {#2} { \exp_not:n { \hskip-\dimexpr #2\relax } }
+      \exp_not:o #1
+      \tl_if_empty:nF {#3} { \exp_not:n { \hskip-\dimexpr #3\relax } }
+    }
+  }
+}
+
+
 %.. \DeclarePageStyle
-\newbox\jlreq@PageStyle@box
+% markの処理
+% 出力する柱は偶数ページでは\leftmark，奇数ページでは\rightmark．
+% 見出し<HEAD>に\rightmarkがついていれば，\<HAED>markを\markrightに書き換える．
+% \leftmarkならば\markbothを使う．
+% \leftmark\rightmark両方の時は\markboth？
+% 現れる全ての見出しのレベルよりも小さいレベルの見出しについては\<HEAD>markを空にする処理を入れる．
+% 実際の出力：
+%  yoko: 
+%    左ページ（縦奇数ページ横偶数ページ）ではノンブルが左（2.6.1.c），なので<ノンブル><空き><柱>
+%    空きが無駄に入らないように気をつける．（右寄せの場合は柱が空なら空きを入れない．）
+%    \setbox..=して，幅が0か否かで判定する．
+%    右ページでは逆になる．<柱><空き><ノンブル>
+%    空きは柱文字で文字サイズ基準で計算する．
+%    <ノンブル>も<柱>もi,ii,...はiが左になるようにする．
+%    <柱>も<ノンブル>も<i中身><空き><ii中身><空き><iii中身>となる
+%    ただし空きは無駄に入れない．左寄せの場合は<i中身>が空ならばその右の<空き>は入れない．
+%    空かの判定は\protected@edefして\ifx\@emptyで判定する．
+
+\newbox \jlreq@PageStyle@box
+\tl_new:N \l__jlreq_pagestyle_odd_top_format_tl
+\tl_new:N \l__jlreq_pagestyle_even_top_format_tl
+\tl_new:N \l__jlreq_pagestyle_odd_bottom_format_tl
+\tl_new:N \l__jlreq_pagestyle_even_bottom_format_tl
+\prop_new:N \l__jlreq_pagestyle_nombre_prop
+\prop_new:N \l__jlreq_pagestyle_nombre_position_prop
+\prop_new:N \l__jlreq_pagestyle_odd_runninghead_prop
+\prop_new:N \l__jlreq_pagestyle_even_runninghead_prop
+\prop_new:N \l__jlreq_pagestyle_runninghead_position_prop
+\prop_new:N \l__jlreq_pagestyle_nombre_font_prop
+\prop_new:N \l__jlreq_pagestyle_runninghead_font_prop
+\prop_new:N \l__jlreq_pagestyle_mark_format_prop
+\tl_new:N \l__jlreq_pagestyle_command_tl
+\tl_new:N \l__jlreq_pagestyle_gap_tl
+\tl_new:N \l__jlreq_pagestyle_nombre_gap_tl
+\tl_new:N \l__jlreq_pagestyle_runninghead_gap_tl
+% 柱とノンブルの間
+\bool_new:N \l__jlreq_pagestyle_clearmarkcommand_bool
+\bool_new:N \l__jlreq_pagestate_tate_bool
+% 作業用
+\tl_new:N \l__jlreq_pagestyle_markcommands_tl
 \NewDocumentCommand{\DeclarePageStyle} { m +m } {%
   \expandafter\edef\csname jlreq@pagestyle@setting@#1\endcsname{\unexpanded{#2}}%
-  \begingroup
-    % フォーマットを空という可能性もあるかもしれないので，デフォルト値は\relaxで表す．
-    \let\jlreq@oddheadformat\relax
-    \let\jlreq@evenheadformat\relax
-    \let\jlreq@oddfootformat\relax
-    \let\jlreq@evenfootformat\relax
-    % 柱とノンブルの間
-    \newif\ifjlreq@clearmarkcommand
-    \newif\ifjlreq@pstate % PageStyleTATE
+  \group_begin:
+    % フォーマットを空という可能性もあるかもしれないので，デフォルト値は\c_novalue_tlで表す．
+    \tl_set_eq:NN \l__jlreq_pagestyle_odd_top_format_tl \c_novalue_tl
+    \tl_set_eq:NN \l__jlreq_pagestyle_even_top_format_tl \c_novalue_tl
+    \tl_set_eq:NN \l__jlreq_pagestyle_odd_bottom_format_tl \c_novalue_tl
+    \tl_set_eq:NN \l__jlreq_pagestyle_even_bottom_format_tl \c_novalue_tl
     \keys_define:nn { PageStyle:#1 } {
-      tate .code:n = {\jlreq@pstatetrue},
-      yoko .code:n = {\jlreq@pstatefalse},
-      nombre .tl_set:N = \jlreq@nombre@i,
-      nombre_position .tl_set:N = \jlreq@nombre@i@position,
-      running_head_position .tl_set:N = \jlreq@running@head@i@position,
-      odd_running_head .tl_set:N = \jlreq@odd@running@head@i,
-      even_running_head .tl_set:N = \jlreq@even@running@head@i,
+      tate .code:n = {\bool_set_true:N \l__jlreq_pagestate_tate_bool},
+      yoko .code:n = {\bool_set_false:N \l__jlreq_pagestate_tate_bool},
+      nombre .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_nombre_prop {0} {##1} },
+      nombre_position .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_nombre_position_prop {0} {##1} },
+      running_head_position .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_runninghead_position_prop {0} {##1} },
+      odd_running_head .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_odd_runninghead_prop {0} {##1} },
+      even_running_head .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_even_runninghead_prop {0} {##1} },
       font .code:n = {
-        \def\jlreq@nombre@font{##1}%
-        \def\jlreq@running@head@font{##1}%
+        \prop_put:Nnn \l__jlreq_pagestyle_nombre_font_prop {0} {##1}
+        \prop_put:Nnn \l__jlreq_pagestyle_runninghead_font_prop {0} {##1}
+      },
+      nombre_font .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_nombre_font_prop {0} {##1} },
+      running_head_font .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_runninghead_font_prop {0} {##1} },
+      mark_format .code:n = {
+        \prop_clear:N \l__jlreq_pagestyle_mark_format_prop
+        \prop_put_from_keyval:Nn \l__jlreq_pagestyle_mark_format_prop {##1}
       },
-      nombre_font .tl_set:N = \jlreq@nombre@font,
-      running_head_font .tl_set:N = \jlreq@running@head@font,
-      mark_format .code:n = {\edef\jlreq@mark@format{\unexpanded{##1}}},
-      command .code:n = {\edef\jlreq@command{\unexpanded{##1}}},
-      gap .tl_set:N = \jlreq@gap,
-      nombre_gap .tl_set:N = \jlreq@nombre@gap,
-      running_head_gap .tl_set:N = \jlreq@running@head@gap,
+      command .tl_set:N = \l__jlreq_pagestyle_command_tl,
+      gap .tl_set:N = \l__jlreq_pagestyle_gap_tl,
+      nombre_gap .tl_set:N = \l__jlreq_pagestyle_nombre_gap_tl,
+      running_head_gap .tl_set:N = \l__jlreq_pagestyle_runninghead_gap_tl,
       % trueにすると，\ps@***実行時にまず\***markを全て\@gobbleにする．
-      clear_markcommand .choices:nn = {true,false}{\csname jlreq@clearmarkcommand##1\endcsname},
-      odd_head_format .code:n = {\edef\jlreq@oddheadformat{\unexpanded{##1}}},
-      even_head_format .code:n = {\edef\jlreq@evenheadformat{\unexpanded{##1}}},
-      odd_foot_format .code:n = {\edef\jlreq@oddfootformat{\unexpanded{##1}}},
-      even_foot_format .code:n = {\edef\jlreq@evenfootformat{\unexpanded{##1}}},
-      % 二つ目
-      nombre_ii .tl_set:N = \jlreq@nombre@ii,
-      nombre_ii_position .tl_set:N = \jlreq@nombre@ii@position,
-      running_head_ii_position .tl_set:N = \jlreq@running@head@ii@position,
-      odd_running_head_ii .tl_set:N = \jlreq@odd@running@head@ii,
-      even_running_head_ii .tl_set:N = \jlreq@even@running@head@ii,
-      nombre_ii_font .tl_set:N = \jlreq@nombre@ii@font,
-      running_head_ii_font .tl_set:N = \jlreq@running@head@ii@font,
-      % 三つ目
-      nombre_iii .tl_set:N = \jlreq@nombre@iii,
-      nombre_iii_position .tl_set:N = \jlreq@nombre@iii@position,
-      running_head_iii_position .tl_set:N = \jlreq@running@head@iii@position,
-      odd_running_head_iii .tl_set:N = \jlreq@odd@running@head@iii,
-      even_running_head_iii .tl_set:N = \jlreq@even@running@head@iii,
-      nombre_iii_font .tl_set:N = \jlreq@nombre@iii@font,
-      running_head_iii_font .tl_set:N = \jlreq@running@head@iii@font
+      clear_markcommand .bool_set:N = \l__jlreq_pagestyle_clearmarkcommand_bool,
+      odd_head_format .code:n = { \tl_set:Nx \l__jlreq_pagestyle_odd_top_format_tl { \exp_not:n {##1} } },
+      even_head_format .code:n = { \tl_set:Nx \l__jlreq_pagestyle_even_top_format_tl { \exp_not:n {##1} } },
+      odd_foot_format .code:n = { \tl_set:Nx \l__jlreq_pagestyle_odd_bottom_format_tl { \exp_not:n {##1} } },
+      even_foot_format .code:n = { \tl_set:Nx \l__jlreq_pagestyle_even_bottom_format_tl { \exp_not:n {##1} } },
+    }
+    \cs_set:Nn \l__jlreq_tmpa:nn {
+      \keys_define:nn { PageStyle:#1 } {
+        nombre_##1 .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_nombre_prop {##2} {####1} },
+        nombre_##1_position .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_nombre_position_prop {##2} {####1} },
+        running_head_##1_position .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_runninghead_position_prop {##2} {####1} },
+        odd_running_head_##1 .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_odd_runninghead_prop {##2} {####1} },
+        even_running_head_##1 .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_even_runninghead_prop {##2} {####1} },
+        nombre_##1_font .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_nombre_font_prop {##2} {####1} },
+        running_head_##1_font .code:n = { \prop_put:Nnn \l__jlreq_pagestyle_runninghead_font_prop {##2} {####1} }
+      }
+    }
+    \clist_map_inline:nn {1,2}{
+      \str_set:Nx \l__jlreq_tmpa_str { \int_to_roman:n { ##1 + 1 } }
+      \exp_args:Nx \l__jlreq_tmpa:nn { \l__jlreq_tmpa_str } { ##1 }
     }
     \keys_set:nn { PageStyle:#1 } {
       yoko,
@@ -4393,359 +4806,191 @@
       running_head_ii_font = {}, running_head_ii_position = {}, odd_running_head_ii = {}, even_running_head_ii = {}, 
       running_head_iii_font = {}, running_head_iii_position = {}, odd_running_head_iii = {}, even_running_head_iii = {}, 
       command = {}, mark_format = {}, gap = {1.5\jlreq@zw}, nombre_gap = {}, running_head_gap = {},
-      clear_markcommand = {true}, 
+      clear_markcommand = true, 
     }
     \keys_set:nn { PageStyle:#1 } {#2}
-    % ノンブル同士の間や柱同士の間のデフォルトはノンブルと柱の間の空き量
-    \ifx\jlreq@nombre@gap\@empty\let\jlreq@nombre@gap=\jlreq@gap\fi
-    \ifx\jlreq@running@head@gap\@empty\let\jlreq@running@head@gap=\jlreq@gap\fi
-    % _iiが存在するか調べて\ifjlreq@headii@existに入れる
-    \newif\ifjlreq@headii@exist
-    \jlreq@headii@existfalse
-    \clist_map_inline:nn { \jlreq@odd@running@head@ii, \jlreq@odd@running@head@ii } {
-      \tl_if_empty:VF ##1 { \jlreq@headii@existtrue }
-    }%
-    % markの処理
-    % (odd|even)_running_head(_ii)が_<見出し命令>で与えられている場合，次のようにする．
-    % * \jlreq@(odd|even)@running@head(@ii)をマーク出力命令（\(left|right)mark or \jlreq@extra(left|right)mark{<num>}）に書き換える
-    %   - evenの場合はleft，oddの場合はright．
-    %   - @iiがなければ\(left|right)mark，@iiがあれば\jlreq@extra(left|right)mark{1}
-    % * 例えば_<見出し命令>が_sectionならば，\jlreq@markdata@sectionに{{<I1>}{<I2>}{<I3>}}を追加する．ここで<I1>，<I2>，<I3>は
-    %   - I1: @iiが無いときにodd or even
-    %   - I2: @iiが無ければ0，あれば1．
-    %   - I3: マーク出力命令がleftかrightに応じて l or r．（上述のようにoddかevenかで判定される．）
-    % * 他にも_sectionが指定されている柱があれば，\jlreq@markdata@sectionにさらに追加で加えていく．
-    % * \jlreq@(odd|even)@running@head(@ii)@heading@levelに<見出し命令>のレベルを入れる．レベルが不明な時は\relaxになる．
-    % また，\jlreq@headingmarklistに<見出し命令>の一覧を入れる．
-    \def\jlreq@headingmarklist{}%
-    \clist_map_variable:nNn { odd, even } \jlreq@parity {
-      \clist_map_variable:nNn { 0, 1, 2 } \jlreq@i {
-        % \jlreq@pagestyle@setmarkが上の処理を行う．
-        \edef\jlreq@next{\noexpand\jlreq@pagestyle@setmark{\exp_not:c {jlreq@\jlreq@parity @running@head@\@roman\numexpr\jlreq@i + 1\relax}}{\exp_not:o {\jlreq@i}}{\exp_not:o {\jlreq@parity}}{jlreq@markdata}{\noexpand\jlreq@headingmarklist}}%
-        \jlreq@next
-      }%
-    }%
-    % \jlreq@minimumlevelに見出しの最低（数値が小さいという意味）レベルを入れる．
-    \let\jlreq@minimumlevel=\@undefined
-    \def\jlreq@markdefinecommand{}%
-    \exp_args:No \clist_map_variable:nNn \jlreq@headingmarklist \jlreq@heading {
-      \ifx\jlreq@heading\@empty\else
-        \expandafter\let\expandafter\jlreq@level\csname jlreq@heading@level@\jlreq@heading\endcsname
-        \ifx\jlreq@level\relax\else
-          \ifx\jlreq@minimumlevel\@undefined\let\jlreq@minimumlevel=\jlreq@level
-          \else\ifnum\jlreq@minimumlevel>\jlreq@level\space\let\jlreq@minimumlevel=\jlreq@level\fi\fi
-        \fi
-        % \jlreq@markdata@<見出し命令>にある情報とmark_formatをもとに，\<見出し命令>markを定義するマクロを作成，\jlreq@markdefinecommandに入れる．
-        \edef\jlreq@do{\noexpand\jlreq@pagestyle@make@headingmark{\ifjlreq@headii@exist *\fi}{\exp_not:o {\jlreq@heading}}{\exp_not:o {\jlreq@mark@format}}{\exp_args:Nc \exp_not:o {jlreq@markdata@\jlreq@heading}}}%
-        \jlreq@do
-        \tl_put_right:Nx \jlreq@markdefinecommand { \exp_not:o {\jlreq@result} }%
-      \fi
-    }%
-    \ifx\jlreq@minimumlevel\@undefined\else
-      \tl_put_right:Nx \jlreq@markdefinecommand { \exp_not:N \jlreq@pagestyle@setclearmark { \exp_not:o {\jlreq@minimumlevel} } }
-    \fi
     % 見出しを出す場合：evenに章などの高いレベルの見出しを出す（2.6.3.a）
-    \@ifundefined{jlreq@odd@running@head@i@heading@level}{}{\@ifundefined{jlreq@even@running@head@i@heading@level}{}{%
-      \ifnum\jlreq@odd@running@head@i@heading@level<\jlreq@even@running@head@i@heading@level
-        \jlreq@note{偶数ページには奇数ページよりアウトラインレベルの高い見出しを入れる (ページスタイル #1 内，2.6.3.a)．}%
-      \fi
-    }}%
-    % 二番目以降にフォント設定を追加
-    \clist_map_variable:nNn { ii, iii } \jlreq@i {
-      \clist_map_variable:nNn { odd, even } \jlreq@parity {
-        \jlreq@pagestyle@addfont@tocs{jlreq@\jlreq@parity @running@head@\jlreq@i}{jlreq@running@head@\jlreq@i @font}%
-      }%
-      \jlreq@pagestyle@addfont@tocs{jlreq@nombre@\jlreq@i}{jlreq@nombre@\jlreq@i @font}%
-    }%
-    % \jlreq@oddhead,\jlreq@oddfoot,\jlreq@evenhead,\jlreq@evenfootに必要なものを入れる．
-    \jlreq@if{\ifjlreq@pstate\fi}{% tate
-      % headの方に処理を入れる．footは空．
-      \def\jlreq@oddfoot{}\def\jlreq@evenfoot{}%
-      \ifx\jlreq@nombre@i@position\@empty\def\jlreq@nombre@i@position{5\jlreq@zw}\fi
-      \ifx\jlreq@running@head@i@position\@empty\def\jlreq@running@head@i@position{4\jlreq@zw}\fi
-      \edef\jlreq@gapcs{\noexpand\hskip\noexpand\glueexpr\exp_not:o {\jlreq@nombre@gap}\noexpand\relax}%
-      \jlreq@pagestyle@addifempty{\jlreq@nombre@iii@position}{\jlreq@nombre@ii}{\jlreq@gapcs}{\jlreq@nombre@iii}%
-      \jlreq@pagestyle@addifempty{\jlreq@nombre@ii@position}{\jlreq@nombre@i}{\jlreq@gapcs}{\jlreq@nombre@ii}%
-      \edef\jlreq@gapcs{\noexpand\hskip\noexpand\glueexpr\exp_not:o {\jlreq@running@head@gap}\noexpand\relax}%
-      \jlreq@pagestyle@addifempty{\jlreq@running@head@iii@position}{\jlreq@odd@running@head@ii}{\jlreq@gapcs}{\jlreq@odd@running@head@iii}%
-      \jlreq@pagestyle@addifempty{\jlreq@running@head@ii@position}{\jlreq@odd@running@head@i}{\jlreq@gapcs}{\jlreq@odd@running@head@ii}%
-      \jlreq@pagestyle@addifempty{\jlreq@running@head@iii@position}{\jlreq@even@running@head@ii}{\jlreq@gapcs}{\jlreq@even@running@head@iii}%
-      \jlreq@pagestyle@addifempty{\jlreq@running@head@ii@position}{\jlreq@even@running@head@i}{\jlreq@gapcs}{\jlreq@even@running@head@ii}%
-      \def\jlreq@nombre@contents{}% ノンブルを入れる（下の方に出力）
-      \clist_map_variable:nNn { i, ii, iii } \jlreq@i {
-        \expandafter\let\expandafter\jlreq@position\csname jlreq@nombre@\jlreq@i @position\endcsname
-        \expandafter\ifx\csname jlreq@nombre@\jlreq@i\endcsname\@empty\else
-          \jlreq@ifgluezero{\glueexpr\jlreq@position\relax}{\def\jlreq@position{}}{}%
-          \expandafter\let\expandafter\jlreq@tempa\expandafter=\csname jlreq@nombre@\jlreq@i\endcsname
-          \jlreq@pagestyle@addfont@tocs{jlreq@tempa}{jlreq@nombre@font}%
-          \tl_put_right:Nx \jlreq@nombre@contents {%
-            \exp_not:N \hbox to 0pt{\exp_not:N \hss
-              \exp_not:o {\jlreq@tempa}%
-              \ifx\jlreq@position\@empty\else\exp_not:n {\hskip \glueexpr}\exp_not:o {\jlreq@position}\exp_not:N \relax\fi
-            }%
-          }%
-        \fi
-      }%
-      % \jlreq@(odd|even)@contentsに柱を入れる（上の方に出力）
-      \clist_map_variable:nNn { odd, even } \jlreq@parity {
-        \expandafter\def\csname jlreq@\jlreq@parity @contents\endcsname{}%
-        \clist_map_variable:nNn { i, ii, iii } \jlreq@i {
-          \expandafter\let\expandafter\jlreq@position\csname jlreq@running@head@\jlreq@i @position\endcsname
-          \expandafter\ifx\csname jlreq@\jlreq@parity @running@head@\jlreq@i\endcsname\@empty\else
-            \jlreq@ifgluezero{\glueexpr\jlreq@position\relax}{\def\jlreq@position{}}{}%
-            \expandafter\let\expandafter\jlreq@tempa\expandafter=\csname jlreq@\jlreq@parity @running@head@\jlreq@i\endcsname
-            \jlreq@pagestyle@addfont@tocs{jlreq@tempa}{jlreq@running@head@font}%
-            \tl_put_right:cx {jlreq@\jlreq@parity @contents} {%
-              \exp_not:N \hbox to 0pt{\exp_not:n {\hskip\glueexpr\headsep + \headheight}%
-                \if@tate\else\exp_not:n {+ \topskip - \Cht}\fi
-                \ifx\jlreq@position\@empty\else + \exp_not:o {\jlreq@position}\fi\exp_not:N \relax
-                \exp_not:o {\jlreq@tempa}%
-                \exp_not:N \hss
-              }%
-            }%
-          \fi
-        }%
-        % \jlreq@(odd|even)headの構築
-        % 空き指定には基本版面の文字サイズを使う（2.6.1.c）
-        \@ifundefined{jlreq@\jlreq@parity headformat}
-          {\def\jlreq@format{####1}}%
-          {\expandafter\let\expandafter\jlreq@format\csname jlreq@\jlreq@parity headformat\endcsname}%
-        \edef\jlreq@do{\unexpanded{\def\jlreq@tempa##1}{\exp_not:o {\jlreq@format}}}\jlreq@do
-        \edef\jlreq@tempb{%
-          \exp_args:Nc \exp_not:o {jlreq@\jlreq@parity @contents}%
-          \noexpand\hfil
-          \exp_not:o {\jlreq@nombre@contents}%
-        }%
-        \expandafter\edef\csname jlreq@\jlreq@parity head\endcsname{%
-          \unexpanded{\setbox\jlreq@tempboxa=\hbox to \dimexpr\headsep + \headheight + \textheight}\if@tate\else\unexpanded{- \topskip + 1\jlreq@zh}\fi\noexpand\relax
-          {%
-            \unexpanded{\tate\adjustbaseline}%
-            \expandafter\exp_not:o \expandafter{\expandafter\jlreq@tempa\expandafter{\jlreq@tempb}}%
-          }%
+    \@ifundefined{jlreq@heading@level@\__jlreq_pagestyle_get_runninghead_section:Nn \l__jlreq_pagestyle_odd_runninghead_prop {0}}{}{
+      \@ifundefined{jlreq@heading@level@\__jlreq_pagestyle_get_runninghead_section:Nn \l__jlreq_pagestyle_even_runninghead_prop {0}}{}{
+        \int_compare:nNnT 
+          {\csname jlreq@heading@level@\__jlreq_pagestyle_get_runninghead_section:Nn \l__jlreq_pagestyle_odd_runninghead_prop {0}\endcsname}
+          <
+          {\csname jlreq@heading@level@\__jlreq_pagestyle_get_runninghead_section:Nn \l__jlreq_pagestyle_even_runninghead_prop {0}\endcsname}
+          {
+            \jlreq@note{偶数ページには奇数ページよりアウトラインレベルの高い見出しを入れる (ページスタイル #1 内，2.6.3.a)．}%
+          }
+      }
+    }
+    % ノンブル同士の間や柱同士の間のデフォルトはノンブルと柱の間の空き量
+    \tl_if_empty:NT \l__jlreq_pagestyle_nombre_gap_tl { \tl_set_eq:NN \l__jlreq_pagestyle_nombre_gap_tl \l__jlreq_pagestyle_gap_tl }
+    \tl_if_empty:NT \l__jlreq_pagestyle_runninghead_gap_tl { \tl_set_eq:NN \l__jlreq_pagestyle_runninghead_gap_tl \l__jlreq_pagestyle_gap_tl }
+    % \<見出し>markを作り，\l__jlreq_tmpa_propに格納
+    \__jlreq_pagestyle_makemarkcommand:NNNN \l__jlreq_tmpa_prop \l__jlreq_pagestyle_odd_runninghead_prop \l__jlreq_pagestyle_even_runninghead_prop \l__jlreq_pagestyle_mark_format_prop
+    % \<見出し>markを定義するコマンドを入れる
+    \tl_set:Nn \l__jlreq_pagestyle_markcommands_tl {}
+    % 最小レベルの決定を行い，\<見出し命令>markの定義を入れていく．
+    \int_set:Nn \l__jlreq_tmpa_int {9999}
+    \prop_map_inline:Nn \l__jlreq_tmpa_prop {
+      \int_compare:nNnT { \l__jlreq_tmpa_int } > { \csname jlreq@heading@level@##1 \endcsname } {
+        \int_set:Nn \l__jlreq_tmpa_int { \csname jlreq@heading@level@##1 \endcsname }
+      }
+      \tl_put_right:Nx \l__jlreq_pagestyle_markcommands_tl { \exp_not:n {##2} }
+    }
+    \int_compare:nNnF {\l__jlreq_tmpa_int}={9999} {
+      \tl_put_right:Nx \l__jlreq_pagestyle_markcommands_tl {
+        \exp_not:N \jlreq@pagestyle@setclearmark {\int_use:N \l__jlreq_tmpa_int }
+      }
+    }
+    \bool_if:NTF \l__jlreq_pagestate_tate_bool {
+      \tl_set:Nx \l__jlreq_do_tl {}
+      \prop_clear:N \l__jlreq_tmpa_prop
+      \clist_map_inline:nn { odd,even } {
+        % .柱→\l__jlreq_tmpa_tl
+        \__jlreq_pagestyle_maketate_runhead:NcNNo \l__jlreq_tmpa_tl { l__jlreq_pagestyle_##1_runninghead_prop } \l__jlreq_pagestyle_runninghead_font_prop \l__jlreq_pagestyle_runninghead_position_prop \l__jlreq_pagestyle_runninghead_gap_tl
+        % ノンブル→\l__jlreq_tmpb_tl
+        \__jlreq_pagestyle_maketate_nombre:NNNNo \l__jlreq_tmpb_tl \l__jlreq_pagestyle_nombre_prop \l__jlreq_pagestyle_nombre_font_prop \l__jlreq_pagestyle_nombre_position_prop \l__jlreq_pagestyle_nombre_gap_tl
+        % 柱とノンブルを結合→\l__jlreq_tmpa_tl
+        \tl_set:Nx \l__jlreq_tmpa_tl { \exp_not:o \l__jlreq_tmpa_tl \exp_not:N \hfil \exp_not:o \l__jlreq_tmpb_tl }
+        % formatを適用．
+        \tl_set:Nn \l__jlreq_tmpb_tl {####1} % デフォルトフォーマット
+        \__jlreq_pagestyle_applyformat:NocN \l__jlreq_tmpa_tl \l__jlreq_tmpa_tl { l__jlreq_pagestyle_##1_top_format_tl } \l__jlreq_tmpb_tl
+        % 周りのボックスをつける．結果は\l__jlreq_tmpa_propにいれる．
+        \prop_put:Nnx \l__jlreq_tmpa_prop { ##1-top } {
+          \exp_not:n {\setbox\@tempboxa=\hbox to \dimexpr\headsep + \headheight + \textheight}
+            \legacy_if:nF { @tate } { \exp_not:n { - \topskip + 1\jlreq@zh } }
+            \exp_not:N \relax
+            { \exp_not:n { \tate\adjustbaseline } \exp_not:o \l__jlreq_tmpa_tl }
           % Underful対策
           \ifx l\jlreq@engine
-            \unexpanded{\wd\jlreq@tempboxa=\headheight}%
+            \unexpanded{\wd\@tempboxa=\headheight}%
           \else
-            \unexpanded{\ht\jlreq@tempboxa=\headheight\dp\jlreq@tempboxa=0pt}%
+            \unexpanded{\ht\@tempboxa=\headheight\dp\@tempboxa=0pt}%
           \fi
-        }%
-      }%
-      % \jlreq@tempboxaを正しく配置する
-      \edef\jlreq@lefthead@adjustbox{%
-        \noexpand\hskip\noexpand\dimexpr\if@tate\unexpanded{- \Cdp}\fi \unexpanded{- \headsep - 1\jlreq@zw\relax}%
-        \unexpanded{\box\jlreq@tempboxa\hfil}%
-      }%
-      \edef\jlreq@righthead@adjustbox{%
-        \noexpand\hskip\unexpanded{\dimexpr\textwidth}\if@tate\unexpanded{- \topskip + \Cht}\fi\unexpanded{ + \headsep\relax}%
-        \unexpanded{\box\jlreq@tempboxa\hss}%
-      }%
-      \if@tate
-        \tl_put_right:Nx \jlreq@oddhead{\exp_not:o {\jlreq@lefthead@adjustbox}}%
-        \tl_put_right:Nx \jlreq@evenhead{\exp_not:o {\jlreq@righthead@adjustbox}}%
-      \else
-        \tl_put_right:Nx \jlreq@oddhead{\exp_not:o {\jlreq@righthead@adjustbox}}%
-        \tl_put_right:Nx \jlreq@evenhead{\exp_not:o {\jlreq@lefthead@adjustbox}}%
-      \fi
+        }
+      }
+      % 位置調整，左側に柱+ノンブルがある場合
+      \tl_set:Nx \l__jlreq_tmpa_tl {
+         \exp_not:n { \hskip\dimexpr } \legacy_if:nT { @tate } { \exp_not:n { - \Cdp } } \exp_not:n { - \headsep - 1\jlreq@zw\relax }
+         \exp_not:n { \box\@tempboxa\hfil }
+      }
+      % 位置調整，右側に柱+ノンブルがある場合
+      \tl_set:Nx \l__jlreq_tmpb_tl {
+         \exp_not:n { \hskip\dimexpr\textwidth } \legacy_if:nT { @tate } { \exp_not:n { - \topskip + \Cht } } \exp_not:n { + \headsep\relax }
+         \exp_not:n { \box\@tempboxa\hss }
+      }
+      % 位置調整とすでに構築したブロックをくっつける．
+      \legacy_if:nTF { @tate } {
+        \prop_put:Nnx \l__jlreq_tmpa_prop { odd-top  } { \prop_item:Nn \l__jlreq_tmpa_prop { odd-top  } \exp_not:o \l__jlreq_tmpa_tl }
+        \prop_put:Nnx \l__jlreq_tmpa_prop { even-top } { \prop_item:Nn \l__jlreq_tmpa_prop { even-top } \exp_not:o \l__jlreq_tmpb_tl }
+      }{
+        \prop_put:Nnx \l__jlreq_tmpa_prop { odd-top  } { \prop_item:Nn \l__jlreq_tmpa_prop { odd-top  } \exp_not:o \l__jlreq_tmpb_tl }
+        \prop_put:Nnx \l__jlreq_tmpa_prop { even-top } { \prop_item:Nn \l__jlreq_tmpa_prop { even-top } \exp_not:o \l__jlreq_tmpa_tl }
+      }
+      % \l__jlreq_tmpa_tlに定義を入れる
+      \tl_set:Nx \l__jlreq_tmpa_tl {
+        \exp_not:n { \def\@oddhead  } { \prop_item:Nn \l__jlreq_tmpa_prop { odd-top  } }
+        \exp_not:n { \def\@oddfoot  } { }
+        \exp_not:n { \def\@evenhead } { \prop_item:Nn \l__jlreq_tmpa_prop { even-top } }
+        \exp_not:n { \def\@evenfoot } { }
+      }
     }{% yoko
-      % 場所を正規化する．
-      \def\jlreq@nombre@i@position@default{{bottom}{center}}%
-      \def\jlreq@running@head@i@position@default{{top}{center}}%
-      % ii以降の位置は指定されていない場合はiのそれに合わせる
-      \clist_map_variable:nNn { jlreq@nombre, jlreq@running@head } \jlreq@tempa {
-        \clist_map_variable:nNn { ii, iii } \jlreq@i {
-          \expandafter\ifx\csname\jlreq@tempa @\jlreq@i @position\endcsname\@empty
-            \expandafter\let\csname\jlreq@tempa @\jlreq@i @position\expandafter\endcsname\csname\jlreq@tempa @i@position\endcsname
-          \fi
-          \expandafter\edef\csname\jlreq@tempa @\jlreq@i @position@default\endcsname{\csname\jlreq@tempa @i@position@default\endcsname}%
-        }%
-      }%
-      \clist_map_variable:nNn {
-        jlreq@nombre@i@position, jlreq@nombre@ii@position, jlreq@nombre@iii@position, jlreq@running@head@i@position, jlreq@running@head@ii@position, jlreq@running@head@iii@position
-      } \jlreq@tempa {
-        \edef\jlreq@next{\noexpand\jlreq@pagestyle@parse@position{\exp_args:Nc \exp_not:o {\jlreq@tempa}}{\exp_not:c {\jlreq@tempa}}{\exp_args:Nc \exp_not:o {\jlreq@tempa @default}}}%
-        \jlreq@next
-      }%
+      \__jlreq_pagestyle_normalizeposition:Nn \l__jlreq_pagestyle_runninghead_position_prop {{top}{center}}
+      \__jlreq_pagestyle_normalizeposition:Nn \l__jlreq_pagestyle_nombre_position_prop {{bottom}{center}}
+      % 警告
+      \cs_set:Nn \__jlreq_tmpa:Nn { \str_set:Nx ##1 { \use_ii:nn ##2 } }
+      \cs_generate_variant:Nn \__jlreq_tmpa:Nn { No }
+      \tl_set:Nx \l__jlreq_tmpa_tl { \prop_item:Nn \l__jlreq_pagestyle_nombre_position_prop {0} }
+      \__jlreq_tmpa:No \l__jlreq_tmpa_str \l__jlreq_tmpa_tl
+      \tl_set:Nx \l__jlreq_tmpb_tl { \prop_item:Nn \l__jlreq_pagestyle_runninghead_position_prop {0} }
+      \__jlreq_tmpa:No \l__jlreq_tmpb_str \l__jlreq_tmpb_tl
       \bool_if:nT { (
         \legacy_if_p:n { @tate } && (
-          \str_if_eq_p:ee { \expandafter\@secondoftwo\jlreq@nombre@i@position } { right } ||
-          \str_if_eq_p:ee { \expandafter\@secondoftwo\jlreq@running@head@i@position }{ right }
+          \str_if_eq_p:Vn \l__jlreq_tmpa_str { right } ||
+          \str_if_eq_p:Vn \l__jlreq_tmpb_str { right} 
         )
       ) || (
         (! \legacy_if_p:n { @tate } ) && (
-          \str_if_eq_p:ee { \expandafter\@secondoftwo\jlreq@nombre@i@position }{ left } ||
-          \str_if_eq_p:ee { \expandafter\@secondoftwo\jlreq@running@head@i@position }{ left }
+          \str_if_eq_p:Vn \l__jlreq_tmpa_str { left } ||
+          \str_if_eq_p:Vn \l__jlreq_tmpb_str { left } 
         )
       ) } {
-        \if@twoside
+        \legacy_if:nT { @twoside } {
           \jlreq@note{柱やノンブルは，左ページでは，基本版面の左端の延長線にノンブル又は柱の先頭をそろえて配置するか，基本版面の左端の延長線から基本版面の文字サイズの全角アキだけ右に寄せた位置に配置する (ページスタイル #1 内，2.6.1.b)．}%
-        \fi
+        }
       }%
       % フォント変更命令に文字出力命令が入っているとエラーになるのを回避するために\setboxでごまかす．
-      \setbox\jlreq@tempboxa=\hbox{\jlreq@running@head@font
+      \setbox\jlreq@tempboxa=\hbox{\prop_item:Nn \l__jlreq_pagestyle_runninghead_font_prop {0}
         \bool_if:nT {
-          \dim_compare_p:n { \jlreq@gap < 1.49\jlreq@zw } ||
-          ( \dim_compare_p:n { \jlreq@gap > 1.51\jlreq@zw } && \dim_compare_p:n { \jlreq@gap < 1.99\jlreq@zw } ) ||
-          \dim_compare_p:n { \jlreq@gap > 2.01\jlreq@zw }
+          \dim_compare_p:n { \l__jlreq_pagestyle_gap_tl < 1.49\jlreq@zw } ||
+          ( \dim_compare_p:n { \l__jlreq_pagestyle_gap_tl > 1.51\jlreq@zw } && \dim_compare_p:n { \l__jlreq_pagestyle_gap_tl < 1.99\jlreq@zw } ) ||
+          \dim_compare_p:n { \l__jlreq_pagestyle_gap_tl > 2.01\jlreq@zw }
         }{
           \jlreq@note{ノンブルと柱との空き量は柱に使用する文字サイズの2倍又は1.5倍とする (ページスタイル #1 内，2.6.1.c)．}
         }
       }%
-      % 初期化
-      \clist_map_variable:nNn { odd, even } \jlreq@parity {
-        \clist_map_variable:nNn { top, bottom } \jlreq@vert {
-          \clist_map_variable:nNn { left, center, right } \jlreq@hor {
-            \clist_map_variable:nNn { nombre, running@head } \jlreq@type {
-              \expandafter\def\csname jlreq@\jlreq@type @\jlreq@parity @\jlreq@vert @\jlreq@hor\endcsname{}%
-            }%
-          }%
-        }%
-        % ページが左か右か
-        \jlreq@ifleftpage{\jlreq@parity}{\def\jlreq@pagehor{left}}{\def\jlreq@pagehor{right}}%
-        % \jlreq@(running@head|nombre)@(odd|even)@(top|bottom)@(left|center|right)に入れていく
-        % 左ページではノンブルが左（2.6.1.c），i,ii,...はiが左になるようにする．
-        \clist_map_variable:nNn { i, ii, iii } \jlreq@i {
-          % nombre
-          \expandafter\ifx\csname jlreq@nombre@\jlreq@i\endcsname\@empty\else
-            \edef\jlreq@position{\csname jlreq@nombre@\jlreq@i @position\endcsname}%
-            \edef\jlreq@vert{\expandafter\@firstoftwo\jlreq@position}%
-            \edef\jlreq@hor{\expandafter\@secondoftwo\jlreq@position}%
-            \str_if_eq:VnT \jlreq@parity { even } {\jlreq@reverse@leftright{\jlreq@hor}}
-            \jlreq@ifleftpage{\jlreq@parity}{\let\jlreq@addtocs=\tl_put_right:cx}{\let\jlreq@addtocs\tl_put_left:cx}%
-            \edef\jlreq@csname{jlreq@nombre@\jlreq@parity @\jlreq@vert @\jlreq@hor}%
-            \expandafter\ifx\csname\jlreq@csname\endcsname\@empty\else\jlreq@addtocs{\jlreq@csname}{\unexpanded{\hskip\glueexpr}\exp_not:o {\jlreq@nombre@gap}\noexpand\relax}\fi
-            \jlreq@addtocs{\jlreq@csname}{\exp_args:Nc \exp_not:o {jlreq@nombre@\jlreq@i}}%
-          \fi
-          % running@head
-          % 一度「紙面の外から」の順番で{A}{B}{C}と入れる
-          \expandafter\ifx\csname jlreq@\jlreq@parity @running@head@\jlreq@i \endcsname\@empty\else
-            \edef\jlreq@position{\csname jlreq@running@head@\jlreq@i @position\endcsname}%
-            \edef\jlreq@vert{\expandafter\@firstoftwo\jlreq@position}%
-            \edef\jlreq@hor{\expandafter\@secondoftwo\jlreq@position}%
-            \str_if_eq:VnT \jlreq@parity { even } {\jlreq@reverse@leftright{\jlreq@hor}}
-            \str_if_eq:VVTF \jlreq@hor \jlreq@pagehor {\let\jlreq@addtocs=\tl_put_right:cx}{\let\jlreq@addtocs=\tl_put_left:cx}%
-            \edef\jlreq@csname{jlreq@running@head@\jlreq@parity @\jlreq@vert @\jlreq@hor}%
-            \jlreq@addtocs{\jlreq@csname}{{\exp_args:Nc \exp_not:o {jlreq@\jlreq@parity @running@head@\jlreq@i}}}%
-          \fi
-        }%
-        % {A}{B}{C}の順だった柱を結合する．本体は\jlreq@pagestyle@make@runninghead．
-        \clist_map_variable:nNn { top, bottom } \jlreq@vert {
-          \clist_map_variable:nNn { left, center, right } \jlreq@hor {
-            \str_if_eq:VnTF \jlreq@hor { right } { \def\jlreq@tempa{*} } { \def\jlreq@tempa{} }
-            \edef\jlreq@do{\noexpand\jlreq@pagestyle@make@runninghead{jlreq@running@head@\jlreq@parity @\jlreq@vert @\jlreq@hor}{\exp_not:o {\jlreq@tempa}}{\exp_not:o {\jlreq@running@head@gap}}}%
-            \jlreq@do
-          }%
-        }%
-        % ノンブルと柱を結合し，必要ならばフォント設定をする．
-        \clist_map_variable:nNn { top, bottom } \jlreq@vert {%
-          \clist_map_variable:nNn { left, center, right } \jlreq@hor {%
-            \edef\jlreq@csname{jlreq@\jlreq@parity @\jlreq@vert @\jlreq@hor}%
-            \edef\jlreq@runheadcsname{jlreq@running@head@\jlreq@parity @\jlreq@vert @\jlreq@hor}%
-            \edef\jlreq@nombrecsname{jlreq@nombre@\jlreq@parity @\jlreq@vert @\jlreq@hor}%
-            % nombreにフォント設定を追加．
-            \expandafter\ifx\csname\jlreq@nombrecsname\endcsname\@empty\else
-              \ifx\jlreq@nombre@font\@empty\else
-                \expandafter\edef\csname\jlreq@nombrecsname\endcsname{{\exp_not:o {\jlreq@nombre@font}\exp_args:Nc \exp_not:o {\jlreq@nombrecsname}}}%
-              \fi
-            \fi
-            \jlreq@if{\expandafter\ifx\csname\jlreq@runheadcsname\endcsname\@empty\fi}{%
-              % 柱が空：ノンブルのみでよい
-              \expandafter\let\csname\jlreq@csname\expandafter\endcsname\csname\jlreq@nombrecsname\endcsname
-            }{%
-              \jlreq@if{\expandafter\ifx\csname\jlreq@nombrecsname\endcsname\@empty\fi}{%
-%                % ノンブルが空．柱のみでよい．
-                \jlreq@pagestyle@addfont@tocs{\jlreq@runheadcsname}{jlreq@running@head@font}%
-                \expandafter\let\csname\jlreq@csname\expandafter\endcsname\csname\jlreq@runheadcsname\endcsname
-              }{%
-%                % 両方ある場合：左ページではノンブルが左，右ページではノンブルが右．
-                \jlreq@ifleftpage{\jlreq@parity}{%
-                  \str_if_eq:VnTF \jlreq@hor { right } {
-                    % <ノンブル><空き><柱>，右寄せ
-                    % 柱が空出ないときに限り<空き>を入れる．
-                    \jlreq@pagestyle@addfont@totokens{\exp_not:N \dim_compare:nF { \exp_not:n { \wd\jlreq@PageStyle@box=0pt } } { \exp_not:N \hskip\exp_not:o {\jlreq@gap}\exp_not:N \relax } }{jlreq@running@head@font}{jlreq@tempa}%
-                    \expandafter\edef\csname\jlreq@csname\endcsname{%
-                      \unexpanded{\setbox\jlreq@PageStyle@box=\hbox}{\exp_not:o {\jlreq@running@head@font}\exp_args:Nc \exp_not:o {\jlreq@runheadcsname}}%
-                      \exp_args:Nc \exp_not:o {\jlreq@nombrecsname}\exp_not:o {\jlreq@tempa}\unexpanded{\box\jlreq@PageStyle@box}%
-                    }%
-                  }{%
-                    % <ノンブル><空き><柱>，左寄せ
-                    % ノンブルは常に空ではないと仮定する．
-                    \jlreq@pagestyle@addfont@totokens{\unexpanded{\hskip\glueexpr}\exp_not:o {\jlreq@gap}\noexpand\relax\exp_args:Nc \exp_not:o {\jlreq@runheadcsname}}{jlreq@running@head@font}{jlreq@tempa}%
-                    \expandafter\edef\csname\jlreq@csname\endcsname{\exp_args:Nc \exp_not:o {\jlreq@nombrecsname}\exp_not:o {\jlreq@tempa}}%
-                  }%
-                }{%
-                  \str_if_eq:VnTF \jlreq@hor { left } {
-                    % <柱><空き><ノンブル>，左寄せ
-                    \jlreq@pagestyle@addfont@totokens{%
-                      \unexpanded{\setbox\jlreq@PageStyle@box=\hbox}{\exp_args:Nc \exp_not:o {\jlreq@runheadcsname}}%
-                      \unexpanded{\copy\jlreq@PageStyle@box}
-                      \exp_not:N \dim_compare:nF { \exp_not:n { \wd\jlreq@PageStyle@box=0pt } } {
-                        \exp_not:n { \hskip\glueexpr } \exp_not:o {\jlreq@gap} \exp_not:N \relax
-                      }
-                    }{jlreq@running@head@font}{jlreq@tempa}%
-                    \expandafter\edef\csname\jlreq@csname\endcsname{\exp_not:o {\jlreq@tempa}\exp_args:Nc \exp_not:o {\jlreq@nombrecsname}}%
-                  }{%
-                    % <柱><空き><ノンブル>，右寄せ
-                    \jlreq@pagestyle@addfont@totokens{\exp_args:Nc \exp_not:o {\jlreq@runheadcsname}\unexpanded{\hskip\glueexpr}\exp_not:o {\jlreq@gap}\noexpand\relax}{jlreq@running@head@font}{jlreq@tempa}%
-                    \expandafter\edef\csname\jlreq@csname\endcsname{\exp_not:o {\jlreq@tempa}\exp_args:Nc \exp_not:o {\jlreq@nombrecsname}}%
-                  }%
-                }%
-              }%
-            }%
-          }%
-        }%
-      }%
-      % 四カ所構築
-      \jlreq@pagestyle@setheadfoot{\jlreq@oddhead}{jlreq@odd@top@left}{jlreq@odd@top@center}{jlreq@odd@top@right}%
-      \jlreq@pagestyle@setheadfoot{\jlreq@oddfoot}{jlreq@odd@bottom@left}{jlreq@odd@bottom@center}{jlreq@odd@bottom@right}%
-      \jlreq@pagestyle@setheadfoot{\jlreq@evenhead}{jlreq@even@top@left}{jlreq@even@top@center}{jlreq@even@top@right}%
-      \jlreq@pagestyle@setheadfoot{\jlreq@evenfoot}{jlreq@even@bottom@left}{jlreq@even@bottom@center}{jlreq@even@bottom@right}%
-      \bool_if:nTF { \dim_compare_p:n { \jlreq@sidenote@length > 0pt } && (! \legacy_if_p:n { @tate } ) }{
-        \def\jlreq@defaultformat{\hss\hbox to \jlreqyokoheadlength{####1}\hss}%
-      }{%
-        \def\jlreq@defaultformat{####1}%
-      }%
-      \jlreq@pagestyle@applyformat{\jlreq@oddhead}{\jlreq@oddheadformat}{\jlreq@defaultformat}%
-      \jlreq@pagestyle@applyformat{\jlreq@evenhead}{\jlreq@evenheadformat}{\jlreq@defaultformat}%
-      \jlreq@pagestyle@applyformat{\jlreq@oddfoot}{\jlreq@oddfootformat}{\jlreq@defaultformat}%
-      \jlreq@pagestyle@applyformat{\jlreq@evenfoot}{\jlreq@evenfootformat}{\jlreq@defaultformat}%
-      % 傍注用調整
-      \ifdim\jlreq@sidenote@length>0pt
-        \if@tate\else
-          \if@twocolumn
-            \jlreq@pagestyle@addsidenotemargin@bothside{\jlreq@oddhead}%
-            \jlreq@pagestyle@addsidenotemargin@bothside{\jlreq@oddfoot}%
-            \jlreq@pagestyle@addsidenotemargin@bothside{\jlreq@evenhead}%
-            \jlreq@pagestyle@addsidenotemargin@bothside{\jlreq@evenfoot}%
-          \else
-            \jlreq@pagestyle@addsidenotemargin@right{\jlreq@oddhead}%
-            \jlreq@pagestyle@addsidenotemargin@right{\jlreq@oddfoot}%
-            \jlreq@pagestyle@addsidenotemargin@left{\jlreq@evenhead}%
-            \jlreq@pagestyle@addsidenotemargin@left{\jlreq@evenfoot}%
-          \fi
-        \fi
-      \fi
-    }%
-    \edef\jlreq@do{%
-      \noexpand\edef\exp_not:c {ps@#1}{%
-        \noexpand\unexpanded{%
-          \unexpanded{\def\jlreq@current@pagestyle{#1}}%
-          \ifjlreq@clearmarkcommand\unexpanded{\jlreq@heading@execmacro@toallheadings\jlreq@clearheadingmarks}\fi
-          \ifjlreq@headii@exist
-            \unexpanded{\let\@mkboth=\jlreq@markboth}%
-          \else
-            \unexpanded{\let\@mkboth=\markboth}%
-          \fi
-          \unexpanded{\def\@oddhead}{\exp_not:o {\jlreq@oddhead}}%
-          \unexpanded{\def\@oddfoot}{\exp_not:o {\jlreq@oddfoot}}%
-          \unexpanded{\def\@evenhead}{\exp_not:o {\jlreq@evenhead}}%
-          \unexpanded{\def\@evenfoot}{\exp_not:o {\jlreq@evenfoot}}%
-          \exp_not:o {\jlreq@markdefinecommand}%
-          \exp_not:o {\jlreq@command}%
-        }%
-      }%
-    }%
-  \expandafter\endgroup
-  \jlreq@do
+      \prop_clear:N \l__jlreq_tmpa_prop % \l__jlreq_tmpa_prop{odd-top}に中身トークン列
+      \clist_map_inline:nn { odd,even } { % ##1
+        \clist_map_inline:nn { top,bottom } { % ####1
+          \prop_clear:N \l__jlreq_tmpb_prop % 左，真ん中，右のトークン列をいったん入れる
+          \clist_map_inline:nn {left,center,right} { % ########1
+            % even時は左右がひっくり返るが，それは下位マクロに任せる
+            % 柱→\l__jlreq_tmpa_tl
+            \__jlreq_pagestyle_makeyoko_each:NnnncNNo \l__jlreq_tmpa_tl {##1} {####1} {########1} { l__jlreq_pagestyle_##1_runninghead_prop } \l__jlreq_pagestyle_runninghead_font_prop \l__jlreq_pagestyle_runninghead_position_prop \l__jlreq_pagestyle_runninghead_gap_tl
+            % ノンブル→\l__jlreq_tmpa_tl
+            \__jlreq_pagestyle_makeyoko_each:NnnncNNo \l__jlreq_tmpb_tl {##1} {####1} {########1} { l__jlreq_pagestyle_nombre_prop } \l__jlreq_pagestyle_nombre_font_prop \l__jlreq_pagestyle_nombre_position_prop \l__jlreq_pagestyle_nombre_gap_tl
+            % 柱とノンブルを結合し\l__jlreq_tmpb_propへ代入
+            \__jlreq_pagestyle_concat_runhead_nombre:Nnnooo \l__jlreq_tmpa_tl {########1} {##1} \l__jlreq_tmpa_tl \l__jlreq_tmpb_tl \l__jlreq_pagestyle_gap_tl
+            \prop_put:Nno \l__jlreq_tmpb_prop {########1} \l__jlreq_tmpa_tl
+          }
+          % 左，中央，右を結合し\l__jlreq_tmpa_tlへ
+          \__jlreq_pagestyle_concat_left_center_right:Nneee \l__jlreq_tmpa_tl {##1} {\prop_item:Nn \l__jlreq_tmpb_prop {left} } {\prop_item:Nn \l__jlreq_tmpb_prop {center} } {\prop_item:Nn \l__jlreq_tmpb_prop {right} }
+          % デフォルトのフォーマットの設定
+          \bool_if:nTF { \dim_compare_p:n { \jlreq@sidenote@length > 0pt } && (! \legacy_if_p:n { @tate } ) }{
+            \tl_set:Nn \l__jlreq_tmpb_tl {\hss\hbox to \jlreqyokoheadlength{########1}\hss}
+          }{
+            \tl_set:Nn \l__jlreq_tmpb_tl {########1}
+          }
+          \__jlreq_pagestyle_applyformat:NocN \l__jlreq_tmpa_tl \l__jlreq_tmpa_tl { l__jlreq_pagestyle_##1_####1_format_tl } \l__jlreq_tmpb_tl
+          % 傍注用調整
+          \dim_compare:nNnT {\jlreq@sidenote@length}>{0pt} {
+            \legacy_if:nF { @tate } {
+              \legacy_if:nTF { @twocolumn } {
+                \__jlreq_pagestyle_addsidenotemargin_bothside:N \l__jlreq_tmpa_tl
+              }{
+                \str_if_eq:nnTF { ##1} { odd } {
+                  \__jlreq_pagestyle_addsidenotemargin_right:N \l__jlreq_tmpa_tl
+                }{
+                  \__jlreq_pagestyle_addsidenotemargin_left:N \l__jlreq_tmpa_tl
+                }
+              }
+            }
+          }
+          \prop_put:Nno \l__jlreq_tmpa_prop {##1-####1} \l__jlreq_tmpa_tl
+        }
+      }
+      % \l__jlreq_tmpa_tlに定義を入れる
+      \tl_set:Nx \l__jlreq_tmpa_tl {
+        \exp_not:n { \def\@oddhead  } { \prop_item:Nn \l__jlreq_tmpa_prop { odd-top     } }
+        \exp_not:n { \def\@oddfoot  } { \prop_item:Nn \l__jlreq_tmpa_prop { odd-bottom  } }
+        \exp_not:n { \def\@evenhead } { \prop_item:Nn \l__jlreq_tmpa_prop { even-top    } }
+        \exp_not:n { \def\@evenfoot } { \prop_item:Nn \l__jlreq_tmpa_prop { even-bottom } }
+      }
+    }
+    % _iiが存在するか調べて\l__jlreq_tmpa_boolに入れる
+    \bool_set:Nn \l__jlreq_tmpa_bool {
+      \prop_if_in_p:Nn \l__jlreq_pagestyle_odd_runninghead_prop {1} || \prop_if_in_p:Nn \l__jlreq_pagestyle_odd_runninghead_prop {2}
+    }
+    \tl_set:Nx \l__jlreq_do_tl {
+      \exp_not:n {\edef} \exp_not:c {ps@#1} { \exp_not:N \exp_not:n {
+        \exp_not:n { \def\jlreq@current@pagestyle{#1} }
+        \bool_if:nT { \l__jlreq_pagestyle_clearmarkcommand_bool } { \exp_not:n { \jlreq@heading@execmacro@toallheadings\jlreq@clearheadingmarks } }
+        \exp_not:n {\let\@mkboth=}\bool_if:NTF \l__jlreq_tmpa_bool { \exp_not:N \markboth } { \exp_not:N \jlreq@markboth }
+        \exp_not:o \l__jlreq_tmpa_tl
+        \exp_not:o \l__jlreq_pagestyle_markcommands_tl
+      }}
+    }
+  \exp_after:wN \group_end:
+  \l__jlreq_do_tl
 }
 
 \if@tate
@@ -4945,11 +5190,11 @@
   *top .code:n =    { \__jlreq_@makecaption_align_set_with_check_value:Vn \l_keys_key_str {#1} },
   *bottom .code:n = { \__jlreq_@makecaption_align_set_with_check_value:Vn \l_keys_key_str {#1} },
   unknown .code:n = {
-    \clist_map_variable:nNn {#1} \l_jlreq_tmpa_tl {
-      \tl_trim_spaces:N \l_jlreq_tmpa_tl
-      \str_set_eq:NN \l_jlreq_tmpa_str \l_keys_key_str
-      \str_put_left:Nn \l_jlreq_tmpa_str {@}
-      \__jlreq_@makecaption_align_set:VV \l_jlreq_tmpa_str \l_jlreq_tmpa_tl
+    \clist_map_variable:nNn {#1} \l__jlreq_tmpa_tl {
+      \tl_trim_spaces:N \l__jlreq_tmpa_tl
+      \str_set_eq:NN \l__jlreq_tmpa_str \l_keys_key_str
+      \str_put_left:Nn \l__jlreq_tmpa_str {@}
+      \__jlreq_@makecaption_align_set:VV \l__jlreq_tmpa_str \l__jlreq_tmpa_tl
     }
   }
 }
@@ -5939,7 +6184,7 @@
         \hbox_to_wd:nn {##1} {
           \def#1 {　}
           \kanjishape{n-jidori}\selectfont
-          \def\kanjishape####1{\jlreq@useoriginalcs{kanjishape}{####1-jidori}}
+          \def\kanjishape####1{\jlreq@useoriginalcs@witharguments{kanjishape}{{####1-jidori}}}
           ##2
           \hskip\glueexpr 0pt~minus~1fil\relax
         }
@@ -5965,7 +6210,7 @@
 \NewDocumentCommand { \akigumi } { m m } {
   \mode_if_vertical:TF { \leavevmode } {}
   \group_begin:
-    \__jlreq_setkanjiskip:nn { \jlreqkanjiskip + #1 } { }
+    \__jlreq_setkanjiskip:nn { \jlreqkanjiskip + #1 } { \jlreqxkanjiskip + #1 }
     \hbox:n {#2}
   \group_end:
 }
-- 
cgit v1.2.3

