% \iffalse meta-comment
%
% Copyright (c) 2022-2025 David Purton <dcpurton@marshwiggle.net>
%
% This work may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3c of this license
% or (at your option) any later version. The latest version of this
% license is in
%    http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
%<*driver>
\DocumentMetadata{lang=en}
\documentclass[a4paper]{l3doc}
\usepackage[bidi=basic, layout=lists]{babel}
\babelprovide[import, main]{australian}
\babelprovide[import, onchar=ids fonts]{ancientgreek}
\babelprovide[import, onchar=ids fonts]{japanese}
\babelprovide[import, mapdigits, onchar=ids fonts]{persian}
\babelfont[ancientgreek]{rm}[BoldFont=NewCM10-Bold]{NewCM10-Regular}
\babelfont[ancientgreek]{tt}{NewCMMono10-Regular}
\babelfont[japanese]{tt}[Scale=.9]{IPAMincho}
\babelfont[persian]{rm}[Renderer = Harfbuzz]{Amiri}
\babelfont[persian]{tt}[Renderer = Harfbuzz, Scale=.75]{Kawkab Mono Regular}
\usepackage{luatexja-fontspec}
\newcommand{\disablecjk}{%
  \ltjsetparameter{jacharrange={-1, -2, -3, -4, -5, -6, -7, -8, -9}}}
\newcommand{\enablecjk}{%
  \ltjsetparameter{jacharrange={-1, +2, +3, -4, -5, +6, +7, -8, +9}}}
\disablecjk
\usepackage[parindent=1em]{scripture}
\usepackage[skins]{tcolorbox}
\newtcolorbox{scriptureexample}[1][]{%
  bicolor, colframe=cyan, colback=cyan!10, colbacklower=white, left=2mm,
  fonttitle=\normalsize\sffamily\bfseries,
  subtitle style={before skip=3mm, after skip=3mm},
  right=2mm, fontupper=\footnotesize, fontlower=\footnotesize, sidebyside,
  sidebyside gap=6mm, sidebyside align=top, lefthand ratio=0.6, before
  skip=\bigskipamount, after skip=\bigskipamount, #1
}
\tcbset{%
  sidebysidecompare/.style={%
    enhanced, colback=white, lefthand ratio=0.5, segmentation empty},
  compare/.style={%
    standard, colback=white, sidebyside=false}
}
\ExplSyntaxOn
\makeatletter
\hook_gput_code:nnn
  { env / scripture / begin }
  { scripturedoc }
  {
    \cs_set_eq:NN \list \__codedoc_oldlist:nn
  }
\cs_new_protected:Npn \__dcp_codedoc_environment_index:n #1
  {
    \@bsphack
    \begingroup
      \__codedoc_target:
      \index
        {
          #1\actualchar{\protect\ttfamily#1}~(environment)
          \encapchar hdclindex{\the\c@HD@hypercount}{usage}
        }
      \index
        {
          environments:\levelchar#1\actualchar{\protect\ttfamily#1}
          \encapchar hdclindex{\the\c@HD@hypercount}{usage}
        }
    \endgroup
    \@esphack
  }
\cs_new_protected:Npn \__dcp_codedoc_envmacro_index:nN #1#2
  {
    \DoNotIndex {#1}
    \bool_if:NT #2
      {
        \__codedoc_if_macro_internal:nF {#1}
          { \seq_gput_right:Nn \g_doc_macros_seq {#1} }
        \hbox_set:Nw \l__codedoc_macro_index_box
          \hbox_unpack_drop:N \l__codedoc_macro_index_box
          \int_gincr:N \c@CodelineNo
          \@bsphack
          \begingroup
            \__codedoc_target:
            \index
              {
                #1\actualchar{\protect\ttfamily#1}~(environment)
                \encapchar hdclindex{\the\c@HD@hypercount}{main}
              }
            \index
              {
                environments:\levelchar#1\actualchar{\protect\ttfamily#1}
                \encapchar hdclindex{\the\c@HD@hypercount}{main}
              }
          \endgroup
          \@esphack
          \int_gdecr:N \c@CodelineNo
        \exp_args:NNNo \hbox_set_end:
          \tl_set:Nn \saved@indexname { \l__codedoc_index_key_tl }
      }
  }
\cs_new_protected:Npn \__dcp_codedoc_hook_index:n #1
  {
    \@bsphack
    \begingroup
      \__codedoc_target:
      \index
        {
          #1\actualchar{\protect\ttfamily#1}~(hook)
          \encapchar hdclindex{\the\c@HD@hypercount}{usage}
        }
      \index
        {
          hooks:\levelchar#1\actualchar{\protect\ttfamily#1}
          \encapchar hdclindex{\the\c@HD@hypercount}{usage}
        }
    \endgroup
    \@esphack
  }
\cs_new_protected:Npn \__dcp_codedoc_hookmacro_index:nN #1#2
  {
    \DoNotIndex {#1}
    \bool_if:NT #2
      {
        \__codedoc_if_macro_internal:nF {#1}
          { \seq_gput_right:Nn \g_doc_macros_seq {#1} }
        \hbox_set:Nw \l__codedoc_macro_index_box
          \hbox_unpack_drop:N \l__codedoc_macro_index_box
          \int_gincr:N \c@CodelineNo
          \@bsphack
          \begingroup
            \__codedoc_target:
            \index
              {
                #1\actualchar{\protect\ttfamily#1}~(hook)
                \encapchar hdclindex{\the\c@HD@hypercount}{main}
              }
            \index
              {
                hooks:\levelchar#1\actualchar{\protect\ttfamily#1}
                \encapchar hdclindex{\the\c@HD@hypercount}{main}
              }
          \endgroup
          \@esphack
          \int_gdecr:N \c@CodelineNo
        \exp_args:NNNo \hbox_set_end:
          \tl_set:Nn \saved@indexname { \l__codedoc_index_key_tl }
      }
  }
\DeclareDocumentEnvironment { environment } { O{} +v }
  {
    \clist_map_inline:nn { #2 }
      {
        \MakeLinkTarget*{environment##1}
      }
    \cs_set_eq:NN \__codedoc_function_index:n \__dcp_codedoc_environment_index:n
    \__codedoc_function:nnw {#1} {#2}
  }
  { \__codedoc_function_end: }
\DeclareDocumentEnvironment { hooks } { O{} +v }
  {
    \clist_map_inline:nn { #2 }
      {
        \MakeLinkTarget*{hook##1}
      }
    \bool_if:NTF \l__codedoc_in_implementation_bool
      {
        \cs_set_eq:NN \__codedoc_macro_index:nN \__dcp_codedoc_hookmacro_index:nN
        \__codedoc_macro:nnw { var , #1 } {#2}
      }
      {
        \cs_set_eq:NN \__codedoc_function_index:n \__dcp_codedoc_hook_index:n
        \__codedoc_function:nnw {#1} {#2}
      }
  }
  {
    \bool_if:NTF \l__codedoc_in_implementation_bool
      { \__codedoc_macro_end: }
      { \__codedoc_function_end: }
  }
\DeclareDocumentEnvironment { option } { O{} +v }
  {
    \cs_set_eq:NN \__codedoc_function_index:n \SpecialOptionIndex
    \clist_map_inline:nn { #2 }
      {
        \MakeLinkTarget*{option##1}
      }
    \__codedoc_function:nnw {#1} {#2}
  }
  { \__codedoc_function_end: }
\DeclareDocumentEnvironment { envmacro } { O{} +v }
  {
    \cs_set_eq:NN \__codedoc_macro_index:nN \__dcp_codedoc_envmacro_index:nN
    \__codedoc_macro:nnw {#1} {#2}
  }
  { \__codedoc_macro_end: }
\DeclareDocumentEnvironment { function } { O{} +v }
  {
    \clist_map_inline:nn { #2 }
      {
        \MakeLinkTarget*{function##1}
      }
    \__codedoc_function:nnw {#1} {#2}
  }
  { \__codedoc_function_end: }
\DeclareDocumentCommand \env { m }
  {
    \hyperlink{environment#1}{\texttt{#1}}
  }
\DeclareDocumentCommand \opt { m }
  {
    \hyperlink{option#1}{\texttt{#1}}
  }
\DeclareDocumentCommand \hook { m }
  {
    \hyperlink{hook#1}{\texttt{#1}}
  }
\DeclareRobustCommand \val {\texttt}
\DeclareDocumentCommand \fn  { O{} m }
  {
    \hyperlink{function \c_backslash_str #2}{
      \__codedoc_cmd:no
        { module = scripture , replace = false , #1 }
        { \c_backslash_str #2} }
  }
\makeatother
\ExplSyntaxOff
\begin{document}
\DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
% \changes{v1.0}{2022/07/27}{First public release}
% \changes{v1.1}{2022/08/27}{Bug fixes}
% \changes{v1.2}{2022/11/02}{Bug fixes}
% \changes{v1.3}{2023/01/08}{Bug fixes}
% \changes{v2.0}{2023/12/26}{Switch \env{scripture} to a \LaTeX{} \val{list}
%   based environment}
% \changes{v2.0}{2023/12/27}{Bug fixes}
% \changes{v2.1}{2025/01/02}{Bug fixes}
% \changes{v2.2}{2025/08/09}{Support footnotes}
% \changes{v2.2}{2025/08/09}{Bug fixes}
%
% \title{The \pkg{scripture} package}
% \author{David Purton\thanks{Email: \url{dcpurton@marshwiggle.net}}}
% \date{2025/08/09 v2.2}
%
% \maketitle
%
% \begin{abstract}
%   The \pkg{scripture} package provides a set of macros for typesetting
%   quotations from the Bible. It provides many features commonly seen in
%   Bibles such as dropped text for chapter numbers, superscripts for verse
%   numbers, indented lines for poetry sections, narrow sections and hanging
%   paragraphs. A reference for the quotation can optionally be added.
% \end{abstract}
%
% \tableofcontents
%
% \begin{documentation}
%
% \section{Introduction}
%
% Bibles tend to use a number of standard features when laying out chapters
% and verses. The main goal for the \pkg{scripture} package is to be able to
% quickly and easily input text and have it output nicely with minimal manual
% adjustment.
%
% The package supports dropped text for chapter numbers, superscripts for
% verse numbers, appropriately indented lines for the first and second halves
% of poetry, flush right sections, centred sections, narrow sections and
% hanging sections.
%
% The package could be used for typesetting an entire Bible, but it is mainly
% envisioned that it will be used for producing Scripture quotations. The
% passage reference can be included on the last line if there is space or
% failing that on the following line.
%
% \subsection{Bug reports and feature requests}
%
% Bug reports and feature requests can be made at the \pkg{scripture} package
% GitHub repository. See \url{https://github.com/dcpurton/scripture}.
%
% \subsection{Limitations}
%
% The \pkg{scripture} package makes extensive use of \LaTeX{} \val{list}
% environments and the \cs{parshape} command. This means there are some
% limitations. In particular, you should not:
% \begin{itemize}
%   \item Nest the \env{scripture} environment or any of its internal
%     environments.
%   \item Modify the \cs{parshape} within a \env{scripture} environment.
%   \item Include any other \val{list} based environment within a
%     \env{scripture} environment.
%   \item Include any \cs{section} (or similar) functions within the
%     \env{scripture} environment. A simple \fn{heading} function is provided
%     instead.
% \end{itemize}
%
% The code which attempts to avoid drop chapters clashing with text is also a
% bit fragile and can easily break, especially when there are unexpected
% paragraph breaks.
%
% Footnotes are supported, but as the \env{midparachap} environment is a
% implemented with a \cs{vbox}, footnotes will vanish. In this case you must
% use \cs{footnotemark} and then \cs{footnotetext} after the \env{midparachap}
% environment.
%
% The \env{poetry} environment uses \cs{obeylines}. This means that it can not
% be placed in the argument of a macro. If you want to use the \env{poetry}
% environment in a \pkg{beamer} slide, you must use the \texttt{fragile} option
% for the \pkg{beamer} \val{frame} environment.
%
% Some attempt is made to encourage appropriate page breaks, especially just
% before a reference is added to a quotation, but this can still sometimes
% fail and a reference will end up on the following page. Usually a little
% more stretchable space on the page before the incorrect break is enough to
% obtain acceptable output.
%
% At least version 2022-11-01 of the \LaTeX\ format is required.
%  
% \section{Documentation}
%
% \subsection{Basic usage}
%
% Scripture quotations must be set within a \env{scripture} environment. A
% simple quotation might be produced as follows:
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Isaiah 56:1--2][version=NIVUK]
%   \ch{56}This is what the \name{Lord} says:
%   \begin{poetry}
%     `Maintain justice
%     and do what is right,
% 
%     for my salvation is close at hand
%     and my righteousness will soon be revealed.
% 
%     \vs{2}Blessed is the one who does this~--
%     the person who holds it fast,
% 
%     who keeps the Sabbath without desecrating it,
%     and keeps their hands from doing any evil.'
%   \end{poetry}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
% 
% \begin{scripture}[Isaiah 56:1--2][version=NIVUK]
%   \ch{56}This is what the \name{Lord} says:
%   \begin{poetry}
%     `Maintain justice
%     and do what is right,
% 
%     for my salvation is close at hand
%     and my righteousness will soon be revealed.
% 
%     \vs{2}Blessed is the one who does this~--
%     the person who holds it fast,
% 
%     who keeps the Sabbath without desecrating it,
%     and keeps their hands from doing any evil.'
%   \end{poetry}
% \end{scripture}
% \end{scriptureexample}
%
% \subsection{Macros for typesetting scripture quotations}
%
% \subsubsection{Functions}
%
% \changes{v1.3}{2022/11/15}{Add feature to highlight translator added words}
% \begin{function}[added=2022-11-15]{\added}
%   \begin{syntax}
%     |\added|\marg{words}
%   \end{syntax}
%   Some Bible translations mark out words added for clarity not found in the
%   original language (e.g., in italics). This can be done using the \fn{added}
%   function. The font and format can be set using the \opt{added/font} and
%   \opt{added/format} options.
% \end{function}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[John 1:18][verse/font=\bfseries,
%     verse/format=#1, verse/sep=0.5em, version=KJV]
%   \vs{18}No man hath seen God at any time, the
%   only begotten Son, which is in the bosom of the
%   Father, he hath declared \added{him}.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[John 1:18][verse/font=\bfseries,
%     verse/format=#1, verse/sep=0.5em, version=KJV]
%   \vs{18}No man hath seen God at any time, the
%   only begotten Son, which is in the bosom of the
%   Father, he hath declared \added{him}.
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v2.2}{2025/03/02}{Add auto chapter numbering}
% \begin{function}{\ch, \ch*, \newch, \newch*}
%   \begin{syntax}
%     |\ch|\oarg{letter}\marg{chapter number}
%     |\ch*|\oarg{letter}\marg{chapter number}
%     |\newch|\oarg{letter}
%     |\newch*|\oarg{letter}
%   \end{syntax}
%   Format a chapter number. By default these are formatted using drop text
%   taking up two lines and the text is separated from the chapter number by a
%   horizontal space of 0.5\,em. The drop text is aligned to the top of
%   \meta{letter} which defaults to the value of \opt{chapter/xchar}, which in
%   turn defaults to a capital \val{X} in the default font.
%
%   If the \opt{chapter/drop} option is \val{true} (default), then this function
%   attempts to add sufficient space for the dropped chapter when its
%   paragraph contains only one line. The starred version suppresses this
%   behaviour.
%
%   \cs{newch} and \cs{newch*} behave similarly except that the chapter number
%   is automatically incremented. The initial chapter can be set by passing
%   \opt{chapter} to the \env{scirpture} environment.
% \end{function}
%
% \begin{scriptureexample}[lefthand ratio=0.55]
% \textbf{\sffamily|\cs{ch}| example}
%
% \begin{verbatim}
% \begin{scripture}[Exodus 20:1--2]
%   \ch{20}And God spoke all these words:
%   \begin{hanging}
%     \noindent\vs{2}`I am the \name{Lord}
%     your God, who brought you out of Egypt,
%     out of the land of slavery.
%   \end{hanging}
% \end{scripture}
% \end{verbatim}
%
% \medskip
%
% \textbf{\sffamily|\cs{ch*}| example}
%
% \begin{verbatim}
% \begin{scripture}[Exodus 20:1--2]
%   \ch*{20}And God spoke all these words:
%   \begin{hanging}
%     \nohang\vs{2}`I am the \name{Lord} your
%     God, who brought you out of Egypt, out of
%     the land of slavery.
%   \end{hanging}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \textbf{\sffamily|\cs{ch}| example}
%
% \medskip
%
% \begin{scripture}[Exodus 20:1--2]
%   \ch{20}And God spoke all these words:
%   \begin{hanging}
%     \noindent\vs{2}`I am the \name{Lord}
%     your God, who brought you out of Egypt,
%     out of the land of slavery.
%   \end{hanging}
% \end{scripture}
%
% \bigskip
%
% \textbf{\sffamily|\cs{ch*}| example}
%
% \medskip
%
% \begin{scripture}[Exodus 20:1--2]
%   \ch*{20}And God spoke all these words:
%   \begin{hanging}
%     \nohang\vs{2}`I am the \name{Lord} your
%     God, who brought you out of Egypt, out of
%     the land of slavery.
%   \end{hanging}
% \end{scripture}
% \end{scriptureexample}
%
% \begin{function}{\extraskip}
%   \begin{syntax}
%     |\extraskip|
%   \end{syntax}
%   Add a small vertical space of \opt{extraskip} between a paragraph. This
%   function attempts to add additional space to avoid a clash with a drop
%   chapter if required.
% \end{function}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Colossians 1:2]
%   \vs{2}To God's holy people in Colossae, the
%   faithful brothers and sisters in Christ:
%
%   \extraskip
%
%   Grace and peace to you from God our Father.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Colossians 1:2]
%   \vs{2}To God's holy people in Colossae, the
%   faithful brothers and sisters in Christ:
%
%   \extraskip
%
%   Grace and peace to you from God our Father.
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v2.1}{2024/11/19}{Add feature to insert simple headings}
% \changes{v2.1}{2024/11/19}{Add \fn{heading} function}
% \begin{function}[added=2024-11-19]{\heading}
%   \begin{syntax}
%     |\heading|\marg{section heading}
%   \end{syntax}
%   The \fn{heading} function provides a simple section heading command for
%   use within the \env{scripture} environment. Only one level is heading is
%   provided. Further levels should be placed outside of the \env{scripture}
%   environment. Additionally, the \fn{heading} function may not be used
%   within a \env{scripture} inner environment.
%
%   The settings of headings can be controlled using the following options:
%   \begin{itemize}
%     \item \opt{heading/aboveskip}
%     \item \opt{heading/afterindent}
%     \item \opt{heading/align}
%     \item \opt{heading/belowskip}
%     \item \opt{heading/font}
%     \item \opt{heading/format}
%     \item \opt{heading/hide}
%     \item \opt{heading/show}
%   \end{itemize}
%
%   \noindent\textbf{Notes:}
%   \begin{itemize}
%     \item \cs{section} and related functions are not supported within the
%       \env{scripture} environment.
%     \item The \fn{heading} function is ignored when the \opt{inline} option
%       is \val{true}.
%   \end{itemize}
% \end{function}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Luke 21:5–6]
%   \heading{Signs of the End of the Age}
%
%   \vs{5}Some of his disciples were remarking
%   about how the temple was adorned with beautiful
%   stones and with gifts dedicated to God. But
%   Jesus said, \vs{6}``As for what you see here,
%   the time will come when not one stone will be
%   left on another; every one of them will be
%   thrown down.''
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Luke 21:5–6]
%   \heading{Signs of the End of the Age}
%
%   \vs{5}Some of his disciples were remarking
%   about how the temple was adorned with beautiful
%   stones and with gifts dedicated to God. But
%   Jesus said, \vs{6}``As for what you see here,
%   the time will come when not one stone will be
%   left on another; every one of them will be
%   thrown down.''
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v1.2}{2022/09/01}{Add divine name feature}
% \begin{function}[added=2022-09-01]{\name, \LORD, \GOD}
%   \begin{syntax}
%     |\name|\marg{divine name}
%     |\LORD|
%     |\GOD|
%   \end{syntax}
%   Modern Bible translations frequently represent God's personal divine name
%   using a small capitals typeface. This can be done using the \fn{name}
%   function. The font and format can be set using the \opt{name/font} and
%   \opt{name/format} options. The \fn{LORD} and \fn{GOD} macros equivalent to
%   \fn{name}|{Lord}| and \fn{name}|{God}| respectively.
%
%   \textbf{Note:} Watch out that trailing spaces are not eaten by \fn{LORD}
%   and \fn{GOD}. Using \fn{name} is safer and semantically better.
% \end{function}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Genesis 15:1--2][version=ESV]
%   \ch{15}After these things the word of the
%   \name{Lord} came to Abram in a vision: ``Fear
%   not, Abram, I am your shield; your reward shall
%   be very great.'' \vs{2}But Abram said, ``O Lord
%   \name{God}, what will you give me, for I
%   continue childless, and the heir of my house is
%   Eliezer of Damascus?''
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Genesis 15:1--2][version=ESV]
%   \ch{15}After these things the word of the
%   \name{Lord} came to Abram in a vision: ``Fear
%   not, Abram, I am your shield; your reward shall
%   be very great.'' \vs{2}But Abram said, ``O Lord
%   \name{God}, what will you give me, for I
%   continue childless, and the heir of my house is
%   Eliezer of Damascus?''
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v1.3}{2022/11/13}{Add \fn{nofirstverse} function}
% \begin{function}[added=2022-11-13]{\nofirstverse}
%   \begin{syntax}
%     |\nofirstverse|
%   \end{syntax}
%   When \opt{verse/first} is |true|, this causes the next \fn{vs} to print
%   normally, rather than using the format specified by
%   \opt{verse/firstformat}. You might do this if your quote begins half way
%   through a paragraph and the first verse should be printed normally.
% \end{function}
%
% \begin{function}{\nohang}
%   \begin{syntax}
%     |\nohang|
%   \end{syntax}
%   In a \env{hanging} environment, this function indents the first line of
%   the paragraph a length of \opt{hanging/hang} $+$ \opt{parindent}.
%   Remaining lines continue to be indented by a length of \opt{hanging/hang}.
% \end{function}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Genesis 1:10--11]
%   \begin{hanging}
%     \noindent\vs{10}God called the dry ground
%     `land', and the gathered waters he called
%     `seas'. And God saw that it was good.
%
%     \nohang\vs{11}Then God said, `Let the land
%     produce vegetation: seed-bearing plants and
%     trees on the land that bear fruit with seed
%     in it, according to their various kinds.'
%     And it was so.
%   \end{hanging}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Genesis 1:10--11]
%   \begin{hanging}
%     \noindent\vs{10}God called the dry ground
%     `land', and the gathered waters he called
%     `seas'. And God saw that it was good.
%
%     \nohang\vs{11}Then God said, `Let the land
%     produce vegetation: seed-bearing plants and
%     trees on the land that bear fruit with seed
%     in it, according to their various kinds.'
%     And it was so.
%   \end{hanging}
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v2.1}{2024/01/18}{Add \fn{nopilcrow} function}
% \begin{function}[added=2024-01-18]{\nopilcrow}
%   \begin{syntax}
%     |\nopilcrow|
%   \end{syntax}
%   When \opt{pilcrow} is |true|, this causes the next pilcrow that would
%   normally by printed to be suppressed. You might do this if your quote
%   begins half way through a paragraph and so should not be marked with a
%   pilcrow.
% \end{function}
%
% \changes{v1.2}{2022/08/31}{Add red letter feature}
% \begin{function}[added=2022-08-31]{\redletteron, \redletteroff}
%   \begin{syntax}
%     |\redletteron|
%     |\redletteroff|
%   \end{syntax}
%   Use \fn{redletteron} and \fn{redletteroff} to mark the beginning and end
%   of sections of text that should be attributed to Jesus speaking. Some
%   attempt is made to ensure that the correct colour continues after an inner
%   environment if \fn{redletteron} or \fn{redletteroff} occurs inside the
%   inner environment. If you experience problems with unexpected colour, try
%   to ensure that matching \fn{redletteron} and \fn{redletteroff} marks occur
%   at the same group level. The colour of the text can be set using the
%   \opt{redletter/colour} option. These commands only have an effect when the
%   \opt{redletter} option is \val{true}.
% \end{function}
%
% \begin{scriptureexample}[lefthand ratio=0.67]
% \begin{verbatim}
% \begin{scripture}[Matthew 21:16--17][redletter]
%   \vs{16}`Do you hear what these children are saying?'
%   they asked him.
%
%   \redletteron `Yes,' \redletteroff replied Jesus,
%   \redletteron `have you
%   never read,
%   \begin{poetry}
%     `\thinspace ``From the lips of children and infants
%     you, Lord, have called forth your praise''?'
%   \end{poetry}\redletteroff
%
%   \vs{17}And he left them and went out of the city to
%   Bethany, where he spent the night.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Matthew 21:16--17][redletter]
%   \vs{16}`Do you hear what these children are saying?'
%   they asked him.
%
%   \redletteron `Yes,' \redletteroff replied Jesus,
%   \redletteron `have you
%   never read,
%   \begin{poetry}
%     `\thinspace ``From the lips of children and infants
%     you, Lord, have called forth your praise''?'
%   \end{poetry}\redletteroff
%
%   \vs{17}And he left them and went out of the city to
%   Bethany, where he spent the night.
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v1.1}{2022/08/07}{Add \fn{scripturecurrentchapter} and
% \fn{scripturecurrentverse} variables}
% \begin{function}[added=2022-08-07]{\scripturecurrentchapter, \scripturecurrentverse}
%   \begin{syntax}
%     |\scripturecurrentchapter|
%     |\scripturecurrentverse|
%   \end{syntax}
%   \fn{scripturecurrentchapter} and \fn{scripturecurrentverse} globally hold
%   the most recent values parsed to \fn{ch} and \fn{vs}. They can initialised
%   with \cs{renewcommand*} if required and could be used in hooks, for
%   example.
% \end{function}
%
% \begin{function}{\scripturesetup}
%   \begin{syntax}
%     |\scripturesetup|\marg{options}
%   \end{syntax}
%   Set default format for quotations. See section \ref{options} for
%   supported formatting \meta{|options|}.
% \end{function}
%
% \changes{v2.0}{2023/12/27}{Add \fn{scripturestyle} function}
% \begin{function}[added=2023/12/27]{\scripturestyle, \scripturestyle*}
%   \begin{syntax}
%     |\scripturestyle|\marg{name}\marg{options}
%     |\scripturestyle*|\marg{name}\marg{options}
%   \end{syntax}
%   Set \meta{|options|} which are saved as style with \meta{|name|}. These
%   can later be set with the \opt{style} option. The starred version appends
%   \meta{|options|} to an existing style rather than overwriting all options.
% \end{function}
%
% \changes{v1.1}{2022/07/29}{Add \fn{selah} function}
% \begin{function}[added=2022-07-29]{\selah}
%   \begin{syntax}
%     |\selah|
%   \end{syntax}
%   In a \env{poetry} environment, this function inserts \emph{Selah} at the
%   end of the current line or the end of the following line if there is
%   insufficient room. See options \opt{selah/font}, \opt{selah/format},
%   \opt{selah/sep} and \opt{selah/text} for options controlling the output.
% \end{function}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Psalm 3:2][version=NIV84]
%   \begin{poetry}
%     \vs{2}Many are saying of me,
%     ``God will not deliver him.''\selah
%   \end{poetry}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Psalm 3:2][version=NIV84]
%   \begin{poetry}
%     \vs{2}Many are saying of me,
%     ``God will not deliver him.''\selah
%   \end{poetry}
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v1.2}{2022/08/30}{Add \fn{textright} function}
% \begin{function}[added=2022-08-30]{\textright}
%   \begin{syntax}
%     |\textright|\marg{text}
%   \end{syntax}
%   This function inserts \meta{|text|} at the end of the current line or the
%   end of the following line if there is insufficient room. The
%   \opt{textright/sep} option controls the minimum allowed space before the
%   \meta{|text|} to be right aligned.
% \end{function}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Jeremiah 2:29]
%   \begin{poetry}
%     \vs{5}`Why do you bring charges against me?
%     You have all rebelled against me,'
%     \textright{declares the \name{Lord}.}
%   \end{poetry}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Jeremiah 2:29]
%   \begin{poetry}
%     \vs{5}`Why do you bring charges against me?
%     You have all rebelled against me,'
%     \textright{declares the \name{Lord}.}
%   \end{poetry}
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v1.3}{2023/01/07}{Add \fn{textscripture} function}
% \begin{function}[added=2023-01-07]{\textscripture}
%   \begin{syntax}
%     |\textscripture|\oarg{reference}\oarg{options}\marg{quotation}
%   \end{syntax}
%   \fn{textscripture} sets an inline scripture quotation. The quotation is
%   surrounded be the values of \opt{inline/begin} and \opt{inline/end} which
%   default to |``| and |''|, respectively. This function also sets the
%   \opt{compact} option and places the \meta{\val{reference}} inline. The
%   reference format can be controlled using the following options:
%   \begin{itemize}
%     \item \opt{inline/reference/format}
%     \item \opt{inline/reference/sep}
%     \item \opt{inline/version/delim}
%     \item \opt{inline/version/format}
%   \end{itemize}
%   Other \meta{\val{reference}} and \meta{\opt{version}} options are
%   inherited.
%
%   This function is equivalent to using the \env{scripture} environment with
%   the \opt{inline} option.
%
%   \textbf{Warning:} \cs{par} is redefined to \cs{relax} inside the
%   \fn{textscripture} function. If you have anything other than expected
%   macros and environments inside your \fn{textscripture} function \TeX{}
%   will likely get stuck in an infinite loop.
% \end{function}
%
% \begin{scriptureexample}
% \begin{verbatim}
% A famous verse in the Bible is:
% \textscripture[John 3:16][verse/hide]{\vs{16}For
% God so loved the world that he gave his one and
% only Son, that whoever believes in him shall not
% perish but have eternal life.}.
% \end{verbatim}
%
% \tcblower
%
% A famous verse in the Bible is:
% \textscripture[John 3:16][verse/hide]{\vs{16}For
% God so loved the world that he gave his one and
% only Son, that whoever believes in him shall not
% perish but have eternal life.}.
% \end{scriptureexample}
%
% \changes{v2.2}{2025/03/02}{Add auto verse numbering}
% \begin{function}{\vs, \newvs}
%   \begin{syntax}
%     |\vs|\marg{verse number}
%     |\newvs|
%   \end{syntax}
%   Format a verse number. By default these are formatted using a superscript.
%
%   \cs{newvs} behaves similarly except that the verse number is automatically
%   incremented. The initial verse can be set by passing \opt{verse} to the
%   \env{scirpture} environment.
% \end{function}
%
% \subsubsection{Environments}
% 
% All scripture quotations must be set within a \env{scripture} environment.
% The rest of the environments documented below are only defined with the
% \env{scripture} environment. In most cases there is a default small
% \meta{\opt{aboveskip}} and \meta{\opt{belowskip}} inserted above and below
% these internal environments, but these are ignored if the environment is at
% the start or end of a \env{scripture} environment.
%
% \begin{environment}{center}
%   \begin{syntax}
%     |\begin{center}|\oarg{options}
%       \quad\meta{centred text}
%     |\end{center}|
%   \end{syntax}
% \end{environment}
%
% \noindent Environment for typesetting centred sections of scripture
% quotations.
%
% See section \ref{centeroptions} for supported formatting \meta{|options|}.
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Daniel 5:25]
%   \vs{25}`This is the inscription that was
%   written:
%   \begin{center}
%     \textsc{mene, mene, tekel, parsin}
%   \end{center}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
% 
% \begin{scripture}[Daniel 5:25]
%   \vs{25}`This is the inscription that was
%   written:
%   \begin{center}
%     \textsc{mene, mene, tekel, parsin}
%   \end{center}
% \end{scripture}
% \end{scriptureexample}
%
% \begin{environment}{flushright}
%   \begin{syntax}
%     |\begin{flushright}|\oarg{options}
%       \quad\meta{right aligned text}
%     |\end{flushright}|
%   \end{syntax}
% \end{environment}
%
% \noindent Environment for typesetting right aligned sections of scripture
% quotations.
%
% See section \ref{flushrightoptions} for supported formatting
% \meta{|options|}.
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Isaiah 40:5]
%   \begin{poetry}[belowskip = 0pt]
%     \vs{5}And the glory of the \name{Lord}\ldots
%     and all people will see it together.
%   \end{poetry}
%
%   \begin{flushright}[aboveskip = 0pt]
%     For the mouth of the \name{Lord} \\
%     has spoken.'
%   \end{flushright}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
% 
% \begin{scripture}[Isaiah 40:5]
%   \begin{poetry}[belowskip = 0pt]
%     \vs{5}And the glory of the \name{Lord}\ldots
%     and all people will see it together.
%   \end{poetry}
%
%   \begin{flushright}[aboveskip = 0pt]
%     For the mouth of the \name{Lord} \\
%     has spoken.'
%   \end{flushright}
% \end{scripture}
% \end{scriptureexample}
%
% \begin{environment}{hanging}
%   \begin{syntax}
%     |\begin{hanging}|\oarg{options}
%       \quad\meta{hanging text}
%     |\end{hanging}|
%   \end{syntax}
% \end{environment}
%
% \noindent Environment for typesetting hanging sections of scripture
% quotations.
%
% See section \ref{hangingoptions} for supported formatting \meta{|options|}.
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Genesis 1:3--5]
%   \begin{hanging}
%     \vs{3}And God said, `Let there be light,' and
%     there was light. \vs{4}God saw that the light
%     was good, and he separated the light from the
%     darkness. \vs{5}God called the light `day',
%     and the darkness he called `night'. And there
%     was evening, and there was morn\-ing---the
%     first day.
%   \end{hanging}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
% 
% \begin{scripture}[Genesis 1:3--5]
%   \begin{hanging}
%     \vs{3}And God said, `Let there be light,' and
%     there was light. \vs{4}God saw that the light
%     was good, and he separated the light from the
%     darkness. \vs{5}God called the light `day',
%     and the darkness he called `night'. And there
%     was evening, and there was morn\-ing---the
%     first day.
%   \end{hanging}
% \end{scripture}
% \end{scriptureexample}
%
% \begin{environment}{midparachap}
%   \begin{syntax}
%     |\begin{midparachap}|\oarg{options}
%       \quad\meta{text containing a chapter break}
%     |\end{midparachap}|
%   \end{syntax}
% \end{environment}
%
% \noindent Environment for typesetting paragraph with a chapter break within
% it.
%
% See section \ref{midparachapoptions} for supported formatting
% \meta{|options|}.
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[1 Corinthians 10:31--11:1]
%   \begin{midparachap}
%     \vs{31}So whether you eat or drink or
%     whatever you do, do it all for the glory of
%     God. \vs{32}Do not cause anyone to stumble,
%     whether Jews, Greeks or the church of
%     God---\vs{33}even as I try to please everyone
%     in every way. For I am not seeking my own
%     good but the good of many, so that they may
%     be saved. \ch{11}Follow my example, as I
%     follow the example of Christ.
%   \end{midparachap}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
% 
% \begin{scripture}[1 Corinthians 10:31--11:1]
%   \begin{midparachap}
%     \vs{31}So whether you eat or drink or
%     whatever you do, do it all for the glory of
%     God. \vs{32}Do not cause anyone to stumble,
%     whether Jews, Greeks or the church of
%     God---\vs{33}even as I try to please everyone
%     in every way. For I am not seeking my own
%     good but the good of many, so that they may
%     be saved. \ch{11}Follow my example, as I
%     follow the example of Christ.
%   \end{midparachap}
% \end{scripture}
% \end{scriptureexample}
%
% \begin{environment}{narrow}
%   \begin{syntax}
%     |\begin{narrow}|\oarg{options}
%       \quad\meta{quotation}
%     |\end{narrow}|
%   \end{syntax}
% \end{environment}
%
% \noindent Environment for typesetting narrow sections of scripture
% quotations. If there is no blank line before the start of a \env{narrow}
% environment the indent will be suppressed.
%
% See section \ref{narrowoptions} for supported formatting \meta{|options|}.
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[2 Kings 18:18--19]
%   \vs{18}They called for the king; and Eliakim
%   son of Hilkiah the palace administrator, Shebna
%   the secretary, and Joah son of Asaph the
%   recorder went out to them.
%
%   \vs{19}The field commander said to them, `Tell
%   Hezekiah:
%
%   \begin{narrow}
%     `\thinspace``This is what the great king, the
%     king of Assyria, says: on what are you basing
%     this confidence of yours?
%   \end{narrow}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
% 
% \begin{scripture}[2 Kings 18:18--19]
%   \vs{18}They called for the king; and Eliakim
%   son of Hilkiah the palace administrator, Shebna
%   the secretary, and Joah son of Asaph the
%   recorder went out to them.
%
%   \vs{19}The field commander said to them, `Tell
%   Hezekiah:
%
%   \begin{narrow}
%     `\thinspace``This is what the great king, the
%     king of Assyria, says: on what are you basing
%     this confidence of yours?
%   \end{narrow}
% \end{scripture}
% \end{scriptureexample}
%
% \begin{environment}{poetry}
%   \begin{syntax}
%     |\begin{poetry}|\oarg{options}
%       \quad\meta{first half of verse}
%       \quad\meta{second half of verse}
%       \quad
%       \quad\meta{first half of verse}
%       \quad\meta{second half of verse}
%     |\end{poetry}|
%   \end{syntax}
% \end{environment}
%
% \noindent Environment for typesetting poetry sections of scripture
% quotations.
%
% Poetry sections of the Bible often have a first half and a parallel second
% half which is indented a little. These should be set on separate consecutive
% lines. Leaving a blank line indicates that the next line should return to
% the first half indent.
%
% See section \ref{poetryoptions} for supported formatting \meta{|options|}.
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Isaiah 1:2]
%   \begin{poetry}
%     \vs{2}Hear me, you heavens! Listen, earth!
%     For the \name{Lord} has spoken:
%
%     `I reared children and brought them up,
%     but they have rebelled against me.
%   \end{poetry}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
% 
% \begin{scripture}[Isaiah 1:2]
%   \begin{poetry}
%     \vs{2}Hear me, you heavens! Listen, earth!
%     For the \name{Lord} has spoken:
%
%     `I reared children and brought them up,
%     but they have rebelled against me.
%   \end{poetry}
% \end{scripture}
% \end{scriptureexample}
%
% \begin{environment}{scripture}
%   \begin{syntax}
%     |\begin{scripture}|\oarg{reference}\oarg{options}
%       \quad\meta{quotation}
%     |\end{scripture}|
%   \end{syntax}
% \end{environment}
%
% \noindent Main environment for typesetting scripture quotations.
%
% The optional \meta{|reference|} is printed at the end of the quotation. See
% section \ref{options} for supported formatting \meta{|options|}.
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[John 3:16][version=NIV]
%   \vs{16}For God so loved the world that he gave
%   his one and only Son, that whoever believes in
%   him shall not perish but have eternal life.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
% 
% \begin{scripture}[John 3:16][version=NIV]
%   \vs{16}For God so loved the world that he gave
%   his one and only Son, that whoever believes in
%   him shall not perish but have eternal life.
% \end{scripture}
% \end{scriptureexample}
%
% \subsection{Provided hooks}
%
% \changes{v1.1}{2022/08/07}{Add before and after hooks for verses and
% chapters}
% \begin{hooks}[added=2022-08-07]{scripture/chap/before, scripture/chap/after, scripture/verse/before, scripture/verse/after}
% The following public hooks are available:
%
% \begin{description}
%   \item[\hook{scripture/chap/before}] This hook is executed immediately
%     before the \opt{chapter/font} is set for the chapter.
%   \item[\hook{scripture/chap/after}] This hook is executed immediately after
%     the \opt{chapter/sep} space is inserted.
%   \item[\hook{scripture/verse/before}] This hook is executed immediately
%     before the \opt{verse/font} is set for the verse.
%   \item[\hook{scripture/verse/after}] This hook is executed immediately after
%     the \opt{verse/sep} space is inserted.
% \end{description}
% \end{hooks}
%
% The following example illustrates how these hooks could be used to place the
% first and last verse on the page into the header.
%
% \begin{scriptureexample}
% \begin{verbatim}
% \documentclass{article}
% \usepackage{scripture}
% \AddToHook{scripture/chap/after}{%
%   \markboth
%     {Mark \scripturecurrentchapter
%        :\scripturecurrentverse}
%     {Mark \scripturecurrentchapter
%        :\scripturecurrentverse}}
% \AddToHook{scripture/verse/after}{%
%   \markboth
%     {Mark \scripturecurrentchapter
%        :\scripturecurrentverse}
%     {Mark \scripturecurrentchapter
%        :\scripturecurrentverse}}
% \renewcommand*{\scripturecurrentchapter}{1}
% \usepackage{fancyhdr}
% \pagestyle{fancy}
% \fancyhf{}
% \lhead{\textbf{\rightmark}}
% \rhead{\textbf{\leftmark} \textbar\ \thepage}
% \begin{document}
% \begin{scripture}[][noindent]
%   \vs{45}Instead he went out and began to talk
%   freely, spreading the news. As a result, Jesus
%   could no longer enter a town openly but stayed
%   outside in lonely places. Yet the people still
%   came to him from everywhere.
%
%   \extraskip
%
%   \ch{2}A few days later, when Jesus again
%   entered Capernaum, the people heard that he had
%   come home.
% \end{scripture}
% \end{document}
% \end{verbatim}
%
% \tcblower
%
% \textbf{Mark 1:45\hfill Mark 2:1} \textbar\ 1
%
% \rule[2mm]{\linewidth}{0.4pt}
%
% \begin{scripture}[][noindent]
%   \vs{45}Instead he went out and began to talk
%   freely, spreading the news. As a result, Jesus
%   could no longer enter a town openly but stayed
%   outside in lonely places. Yet the people still
%   came to him from everywhere.
%
%    \extraskip
%
%   \ch{2}A few days later, when Jesus again
%   entered Capernaum, the people heard that he had
%   come home.
% \end{scripture}
% \end{scriptureexample}
%
% \subsection{Options}
% \label{options}
%
% \changes{v1.3}{2023/01/08}{Remove \texttt{reference/delim} option}
%
% Default formatting \meta{|options|} can be set using
% \cs{usepackage}|[|\meta{|options|}|]{scripture}| or
% \fn{scripturesetup}|{|\meta{|options|}|}|. Local formatting \meta{|options|}
% can be set by passing them to the various environments described above.
%
% \begin{option}{aboveskip}
%   \begin{syntax}
%     aboveskip = \meta{skip} \hfill Default: 0pt
%   \end{syntax}
%   \meta{|skip|} inserted above the \env{scripture} environment.
% \end{option}
%
% \changes{v1.3}{2022/11/15}{Add \opt{added/font} option}
% \begin{option}[added=2022-11-15]{added/font}
%   \begin{syntax}
%     added/font = \meta{font} \hfill Default: \emph{Empty}
%   \end{syntax}
%   \meta{|font|} used for the \fn{added} function.
% \end{option}
%
% \changes{v1.3}{2022/11/15}{Add \opt{added/format} option}
% \begin{option}[added=2022-11-15]{added/format}
%   \begin{syntax}
%     added/format = \meta{macro} \hfill Default: \cs{emph}\{\#1\}
%   \end{syntax}
%   \meta{|macro|} used to format the words that should be highlighted as
%   added by the translators using the \fn{added} function. |#1| contains the
%   text of the argument to \fn{added}.
% \end{option}
%
% \changes{v2.1}{2024/06/01}{Add \opt{after} option}
% \begin{option}[added=2024-06-01]{after}
%   \begin{syntax}
%     after = \meta{token list} \hfill Default: \emph{Empty}
%   \end{syntax}
%   Execute \meta{|token list|} at the end of the \env{scripture} environment.
% \end{option}
%
% \changes{v2.1}{2024/06/01}{Add \opt{before} option}
% \begin{option}[added=2024-06-01]{before}
%   \begin{syntax}
%     before = \meta{token list} \hfill Default: \emph{Empty}
%   \end{syntax}
%   Execute \meta{|token list|} at the beginning of the \env{scripture}
%   environment.
% \end{option}
%
% \begin{option}{belowskip}
%   \begin{syntax}
%     belowskip = \meta{skip} \hfill Default: 0pt
%   \end{syntax}
%   \meta{|skip|} inserted below the \env{scripture} environment.
% \end{option}
%
% \changes{v2.2}{2025/03/02}{Add \opt{book} option}
% \begin{option}[added=2025-03-02]{book}
%   \begin{syntax}
%     book = name\hfill Default: \emph{Empty}
%   \end{syntax}
%   Initialise the book name for the current quotation.
%
%   See also \opt{chapter} and \opt{verse}.
% \end{option}
%
% \changes{v2.2}{2025/03/02}{Add \opt{chapter} option}
% \begin{option}[added=2025-03-02]{chapter}
%   \begin{syntax}
%     chapter = \meta{integer}\hfill Default: 1
%   \end{syntax}
%   Initialise the chapter number when using automatic chapter numbering with
%   \cs{newch}.
%
%   See also \opt{book} and \opt{verse}.
% \end{option}
%
% \changes{v2.1}{2024/12/30}{Add \opt{chapter/align} option}
% \begin{option}[added=2024-12-30]{chapter/align}
%   \begin{syntax}
%     chapter/align = left \textbar\ right\hfill Default: left
%   \end{syntax}
%   When \opt{chapter/align} is set to \val{right} a chapter will overlap to
%   the left when \opt{chapter/nodrop} is set.
%
%   See also \opt{chapter/valign}.
% \end{option}
%
% \changes{v1.2}{2022/09/07}{Add \opt{chapter/colour} option}
% \begin{option}[added=2022-09-07]{chapter/colour, chapter/color}
%   \begin{syntax}
%     chapter/colour = \meta{colour expression} \hfill Default: .
%   \end{syntax}
%   The \pkg{l3color} \meta{|colour expression|} to be used for chapter
%   numbers. By default the current colour is inherited. \opt{chapter/color}
%   is an alias for \opt{chapter/colour}.
% \end{option}
%
% \begin{option}{chapter/drop}
%   \begin{syntax}
%     chapter/drop = \meta{boolean} \hfill Default: true
%   \end{syntax}
%   Whether the chapter should be set as a drop letter taking up two
%   lines or as a normal letter taking up one line. The value of
%   \meta{|boolean|} is optional and assumed to be \val{true} if not present.
%   This option is the opposite of \opt{chapter/nodrop}.
% \end{option}
%
% \begin{option}{chapter/font}
%   \begin{syntax}
%     chapter/font = \meta{font} \hfill Default: \cs{bfseries}
%   \end{syntax}
%   \meta{|font|} used for the \fn{ch} function.
% \end{option}
%
% \changes{v1.1}{2022/07/28}{Add \opt{chapter/format} option}
% \begin{option}[added=2022-07-28]{chapter/format}
%   \begin{syntax}
%     chapter/format = \meta{macro} \hfill Default: \#1
%   \end{syntax}
%   \meta{|macro|} used to format the \val{chapter} for a \env{scripture}
%   quotation. |#1| contains the text of the \val{chapter}.
% \end{option}
%
% \changes{v1.1}{2022/08/15}{Add \opt{chapter/hide} option}
% \begin{option}[added=2022-08-15]{chapter/hide}
%   \begin{syntax}
%     chapter/hide = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Whether chapters should be shown or hidden. The value of \meta{|boolean|}
%   is optional and assumed to be \val{true} if not present. This option is
%   the opposite of \opt{chapter/show}. Note that the \hook{scripture/chap/before}
%   and \hook{scripture/chap/after} hooks are still executed when chapters are
%   hidden.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Romans 5:1--2][chapter/hide]
%   \ch{5}Therefore, since we have been justified
%   through faith, we have peace with God through
%   our Lord Jesus Christ, \vs{2}through whom we
%   have gained access by faith into this grace in
%   which we now stand. And we boast in the hope of
%   the glory of God.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Romans 5:1--2][chapter/hide]
%   \ch{5}Therefore, since we have been justified
%   through faith, we have peace with God through
%   our Lord Jesus Christ, \vs{2}through whom we
%   have gained access by faith into this grace in
%   which we now stand. And we boast in the hope of
%   the glory of God.
% \end{scripture}
% \end{scriptureexample}
%
% \begin{option}{chapter/nodrop}
%   \begin{syntax}
%     chapter/nodrop = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Whether the chapter should be set as a drop letter taking up two lines or
%   as a normal letter taking up one line. The value of \meta{|boolean|} is
%   optional and assumed to be \val{true} if not present. This option is the
%   opposite of \opt{chapter/drop}.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[John 1:1--3][chapter/nodrop]
%   \ch{1}In the beginning was the Word, and the
%   Word was with God, and the Word was God.
%   \vs{2}He was with God in the beginning.
%   \vs{3}Through him all things were made; without
%   him nothing was made that has been made.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[John 1:1--3][chapter/nodrop]
%   \ch{1}In the beginning was the Word, and the
%   Word was with God, and the Word was God.
%   \vs{2}He was with God in the beginning.
%   \vs{3}Through him all things were made; without
%   him nothing was made that has been made.
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v2.1}{2024/01/05}{Add feature to set chapters in a paragraph of
% their own}
% \changes{v2.1}{2024/01/05}{Add \opt{chapter/para} option}
% \begin{option}[added=2024-01-05]{chapter/para}
%   \begin{syntax}
%     chapter/para = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Set chapters in their own paragraph. The spacing before and after the
%   chapter heading can be set using the \opt{chapter/para/aboveskip} and
%   \opt{chapter/para/belowskip} options. The value of \meta{|boolean|} is
%   optional and assumed to be \val{true} if not present.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[John 1:1][chapter/para,
%     chapter/format=CHAPTER~#1, version=KJV]
%   \ch{1}In the beginning was the Word, and the
%   Word was with God, and the Word was God.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[John 1:1][chapter/para,
%     chapter/format=CHAPTER~#1, version=KJV]
%   \ch{1}In the beginning was the Word, and the
%   Word was with God, and the Word was God.
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v2.1}{2024/01/05}{Add \opt{chapter/para/aboveskip} option}
% \begin{option}[added=2024-01-05]{chapter/para/aboveskip}
%   \begin{syntax}
%     chapter/para/aboveskip = \meta{skip} \hfill Default: \cs{bigskipamount}
%   \end{syntax}
%   \meta{|skip|} added above \fn{ch} when \opt{chapter/para} is in effect.
%   To be consistent with how the \pkg{parskip} package treats headings, no
%   additional \cs{parskip} is inserted.
% \end{option}
%
% \changes{v2.1}{2024/01/05}{Add \opt{chapter/para/belowskip} option}
% \begin{option}[added=2024-01-05]{chapter/para/belowskip}
%   \begin{syntax}
%     chapter/para/belowskip = \meta{skip} \hfill Default: \cs{medskipamount}
%   \end{syntax}
%   \meta{|skip|} added below \fn{ch} when \opt{chapter/para} is in effect.
%   To be consistent with how the \pkg{parskip} package treats headings, no
%   additional \cs{parskip} is inserted.
% \end{option}
%
% \changes{v2.1}{2024/01/05}{Add \opt{chapter/para/indent} option}
% \begin{option}[added=2024-01-05]{chapter/para/indent}
%   \begin{syntax}
%     chapter/para/indent = \meta{boolean} \hfill Default: true
%   \end{syntax}
%   Whether to indent the line following a chapter heading when the
%   \opt{chapter/para} option is set to \val{true}. This only has an effect in
%   the \env{scripture}, \env{narrow} and \env{midparachap} environments. The
%   value of \meta{|boolean|} is optional and assumed to be \val{true} if not
%   present.
% \end{option}
%
% \begin{option}{chapter/sep}
%   \begin{syntax}
%     chapter/sep = \meta{dimen} \hfill Default: 0.5em
%   \end{syntax}
%   \meta{|dimen|} used to separate a \fn{ch} from the following text.
% \end{option}
%
% \changes{v1.1}{2022/08/15}{Add \opt{chapter/show} option}
% \begin{option}[added=2022-08-15]{chapter/show}
%   \begin{syntax}
%     chapter/show = \meta{boolean} \hfill Default: true
%   \end{syntax}
%   Whether chapters should be shown or hidden. The value of \meta{|boolean|}
%   is optional and assumed to be \val{true} if not present. This option is
%   the opposite of \opt{chapter/hide}.
% \end{option}
%
% \changes{v1.1}{2022/11/14}{Add \opt{chapter/showverse} option}
% \begin{option}[added=2022-11-14]{chapter/showverse}
%   \begin{syntax}
%     chapter/showverse = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Whether \fn{vs}|{1}| should be automatically inserted after \fn{ch}. The
%   value of \meta{|boolean|} is optional and assumed to be \val{true} if not
%   present. See also \opt{midparachap/showverse} and
%   \opt{midparachap/hideverse}. Note that \opt{chapter/showverse} take
%   precedence over \opt{midparachap/hideverse}.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[John 1:1][chapter/showverse]
%   \ch{1}In the beginning was the Word, and the
%   Word was with God, and the Word was God.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[John 1:1][chapter/showverse]
%   \ch{1}In the beginning was the Word, and the
%   Word was with God, and the Word was God.
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v2.1}{2024/12/30}{Add \opt{chapter/smash} option}
% \begin{option}[added=2024-12-30]{chapter/smash}
%   \begin{syntax}
%     chapter/smash = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Whether a chapter should be wrapped in \cs{smash} when
%   \opt{chapter/nodrop} is set. This allows the chapter number to be larger
%   than the line height without affecting line spacing. The value of
%   \meta{|boolean|} is optional and assumed to be \val{true} if not present.
% \end{option}
%
% \changes{v2.1}{2024/12/30}{Add \opt{chapter/valign} option}
% \begin{option}[added=2024-12-30]{chapter/valign}
%   \begin{syntax}
%     chapter/align = bottom \textbar\ middle \textbar\ top\hfill Default: bottom
%   \end{syntax}
%   Sets how a chapter will align vertically when \opt{chapter/nodrop} is set.
%   \begin{itemize}
%     \item \val{bottom}: Chapter will align at the text base line.
%     \item \val{middle}: Chapter will align at the center of text.
%     \item \val{top}: Chapter will align at the top of text.
%   \end{itemize}
%
%   See also \opt{chapter/align}.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \documentclass{article}
% \usepackage{babel}
% \babelprovide[import, main]{english}
% \babelprovide[import,
%   onchar=ids fonts]{ancientgreek}
% \babelfont[ancientgreek]{rm}[
%   BoldFont=NewCM10-Bold]{NewCM10-Regular}
% \usepackage{scripture}
% \begin{document}
% \begin{scripture}[Κατά Μάρκον 1:1--3][
%     chapter/font=\huge\bfseries,
%     chapter/align=right, chapter/nodrop,
%     chapter/smash, chapter/valign=top,
%     hanging/hang=1em, hanging/leftmargin=2em,
%     hanging/verse/sep=1em, language=ancientgreek,
%     verse/font=\sffamily\bfseries,
%     verse/sep=0.25em, version=THGNT]
%   \begin{hanging}
%     \ch{1}Ἀρχὴ τοῦ εὐαγγελίου Ἰησοῦ χριστοῦ υἱοῦ
%     θεοῦ· \vs{2}καθὼς γέγραπται ἐν τῷ Ἡσαΐᾳ τῷ
%     προφήτῃ· ἰδοὺ ἀποστέλλω τὸν ἄγγελόν μου πρὸ
%     προσώπου σου, ὃς κατασκευάσει τὴν ὁδόν σου.
%     \vs{3}φωνὴ βοῶντος ἐν τῇ ἐρήμῳ ἑτοιμάσατε τὴν
%     ὁδὸν κυρίου, εὐθείας ποιεῖτε τὰς τρίβους αὐτοῦ.
%   \end{hanging}
% \end{scripture}
% \end{document}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Κατά Μάρκον 1:1--3][
%     chapter/font=\huge\bfseries,
%     chapter/align=right, chapter/nodrop,
%     chapter/smash, chapter/valign=top,
%     hanging/hang=1em, hanging/leftmargin=2em,
%     hanging/verse/sep=1em, language=ancientgreek,
%     verse/font=\sffamily\bfseries,
%     verse/sep=0.25em, version=THGNT]
%   \begin{hanging}
%     \ch{1}Ἀρχὴ τοῦ εὐαγγελίου Ἰησοῦ χριστοῦ υἱοῦ
%     θεοῦ· \vs{2}καθὼς γέγραπται ἐν τῷ Ἡσαΐᾳ τῷ
%     προφήτῃ· ἰδοὺ ἀποστέλλω τὸν ἄγγελόν μου πρὸ
%     προσώπου σου, ὃς κατασκευάσει τὴν ὁδόν σου.
%     \vs{3}φωνὴ βοῶντος ἐν τῇ ἐρήμῳ ἑτοιμάσατε τὴν
%     ὁδὸν κυρίου, εὐθείας ποιεῖτε τὰς τρίβους αὐτοῦ.
%   \end{hanging}
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v2.1}{2025/01/01}{Add \opt{chapter/xchar} option}
% \begin{option}[added=2025-01-01]{chapter/xchar}
%   \begin{syntax}
%     chapter/xchar = \meta{character}\hfill Default: X
%   \end{syntax}
%   Sets the character to which drop chapters and vertically aligned non-drop
%   chapters are aligned. This can also be set for individual chapters using
%   an optional argument to \fn{ch}.
% \end{option}
%
% \changes{v1.2}{2022/08/31}{Add \opt{colour} option}
% \begin{option}[added=2022-08-31]{colour, color}
%   \begin{syntax}
%     colour = \meta{colour expression} \hfill Default: .
%   \end{syntax}
%   The \pkg{l3color} \meta{|colour expression|} to be used for the
%   \env{scripture} environment. By default the current colour is inherited.
%   \opt{color} is an alias for \opt{colour}.
% \end{option}
%
% \changes{v1.1}{2022/08/15}{Add \opt{compact} option}
% \begin{option}[added=2022-08-15]{compact}
%   \begin{syntax}
%     compact = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   This option removes all paragraph breaks along with any \fn{extraskip} in
%   the quotation so the whole quotation is a single paragraph of running
%   prose. This option implies \opt{chapter/nodrop} and all options relating
%   to inner environments are ignored.
%
%   The value of \meta{|boolean|} is optional and assumed to be \val{true} if
%   not present.
%
%   \textbf{Warning:} This option redefines \cs{par} to \cs{relax} inside the
%   \env{scripture} environment. If you have anything other than expected
%   macros and environments inside your \env{scripture} environment \TeX{}
%   will likely get stuck in an infinite loop.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Jonah 1:17--2:2a][compact]
%   \begin{midparachap}
%     \vs{17}Now the \name{Lord} provided a huge
%     fish to swallow Jonah, and Jonah was in the
%     belly of the fish three days and three
%     nights. \ch{2}From inside the fish Jonah
%     prayed to the \name{Lord} his God. \vs{2}He
%     said:
%   \end{midparachap}
%   \begin{poetry}
%     `In my distress I called to the \name{Lord},
%     and he answered me.
%   \end{poetry}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Jonah 1:17--2:2a][compact]
%   \begin{midparachap}
%     \vs{17}Now the \name{Lord} provided a huge
%     fish to swallow Jonah, and Jonah was in the
%     belly of the fish three days and three
%     nights. \ch{2}From inside the fish Jonah
%     prayed to the \name{Lord} his God. \vs{2}He
%     said:
%   \end{midparachap}
%   \begin{poetry}
%     `In my distress I called to the \name{Lord},
%     and he answered me.
%   \end{poetry}
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v2.1}{2025/01/01}{Add \opt{defaults} option}
% \begin{option}[added=2025-01-01]{defaults}
%   \begin{syntax}
%     defaults
%   \end{syntax}
%   Resets options to defaults.
% \end{option}
%
% \begin{option}{extraskip}
%   \begin{syntax}
%     extraskip = \meta{skip} \hfill Default: \cs{medskipamount}
%   \end{syntax}
%   \meta{|skip|} used for the \fn{extraskip} function.
% \end{option}
%
% \begin{option}{font}
%   \begin{syntax}
%     font = \meta{font} \hfill Default: \emph{Empty}
%   \end{syntax}
%   \meta{|font|} used for the \env{scripture} environment.
% \end{option}
%
% \changes{v2.1}{2024/11/19}{Add \opt{heading/aboveskip} option}
% \begin{option}[added=2024-11-19]{heading/aboveskip}
%   \begin{syntax}
%     heading/aboveskip = \meta{skip} \hfill Default: \cs{bigskipamount}
%   \end{syntax}
%   \meta{|skip|} inserted above a \fn{heading}.
% \end{option}
%
% \changes{v2.1}{2024/11/19}{Add \opt{heading/afterindent} option}
% \begin{option}[added=2024-11-19]{heading/afterindent}
%   \begin{syntax}
%     heading/afterindent = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Whether to indent the first paragraph following a \fn{heading}. The value
%   of \meta{|boolean|} is optional and assumed to be \val{true} if not
%   present.
% \end{option}
%
% \changes{v2.1}{2024/11/19}{Add \opt{heading/align} option}
% \begin{option}[added=2024-11-19]{heading/align}
%   \begin{syntax}
%     heading/align = left \textbar\ right \textbar\ center \hfill Default: left
%   \end{syntax}
%   Set the alignment of a \fn{heading}.
% \end{option}
%
% \changes{v2.1}{2024/11/19}{Add \opt{heading/belowskip} option}
% \begin{option}[added=2024-11-19]{heading/belowskip}
%   \begin{syntax}
%     heading/belowskip = \meta{skip} \hfill Default: \cs{medskipamount}
%   \end{syntax}
%   \meta{|skip|} inserted below a \fn{heading}.
% \end{option}
%
% \changes{v2.1}{2024/11/19}{Add \opt{heading/font} option}
% \begin{option}[added=2024-11-19]{heading/font}
%   \begin{syntax}
%     heading/font = \meta{font} \hfill Default: \cs{small}\cs{itshape}
%   \end{syntax}
%   \meta{|font|} used for a \fn{heading}.
% \end{option}
%
% \changes{v2.1}{2024/11/19}{Add \opt{heading/format} option}
% \begin{option}[added=2024-11-19]{heading/format}
%   \begin{syntax}
%     heading/format = \meta{macro} \hfill Default: \#1
%   \end{syntax}
%   \meta{|macro|} used to format a \fn{heading}. |#1| contains the text of
%   the \val{heading}.
% \end{option}
%
% \changes{v2.1}{2024/11/19}{Add \opt{heading/hide} option}
% \begin{option}[added=2024-11-19]{heading/hide}
%   \begin{syntax}
%     heading/hide = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Whether to hide \fn{heading} functions. The value of \meta{|boolean|} is
%   optional and assumed to be \val{true} if not present. This option is the
%   opposite of \opt{heading/show}.
% \end{option}
%
% \changes{v2.1}{2024/11/19}{Add \opt{heading/show} option}
% \begin{option}[added=2024-11-19]{heading/show}
%   \begin{syntax}
%     heading/show = \meta{boolean} \hfill Default: true
%   \end{syntax}
%   Whether to show \fn{heading} functions. The value of \meta{|boolean|} is
%   optional and assumed to be \val{true} if not present. This option is the
%   opposite of \opt{heading/hide}.
% \end{option}
%
% \begin{option}{indent}
%   \begin{syntax}
%     indent = \meta{boolean} \hfill Default: true
%   \end{syntax}
%   Whether to indent the first line of a \env{scripture} environment or not
%   by \opt{parindent}. The value of \meta{|boolean|} is optional and assumed
%   to be \val{true} if not present. This option is the opposite of
%   \opt{noindent}.
% \end{option}
%
% \changes{v1.3}{2023/01/07}{Add \opt{inline} option}
% \begin{option}[added=2023-01-07]{inline}
%   \begin{syntax}
%     inline = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Set the scripture quotation inline. The quotation is surrounded be the
%   values of \opt{inline/begin} and \opt{inline/end} which default to |``|
%   and |''|, respectively. This option also sets the \opt{compact} option and
%   sets the \meta{\val{reference}} inline. The reference format can be
%   controlled using the following options:
%   \begin{itemize}
%     \item \opt{inline/reference/format}
%     \item \opt{inline/reference/sep}
%     \item \opt{inline/version/delim}
%     \item \opt{inline/version/format}
%   \end{itemize}
%   Other \meta{\val{reference}} and \meta{\opt{version}} options are inherited.
%
%   \textbf{Warning:} \cs{par} is redefined to \cs{relax} when the
%   \opt{inline} option is set. If you have anything other than expected
%   macros and environments inside your quotation \TeX{} will likely get stuck
%   in an infinite loop.
% \end{option}
%
% \changes{v1.3}{2023/01/07}{Add \opt{inline/begin} option}
% \begin{option}[added=2023-01-07]{inline/begin}
%   \begin{syntax}
%     inline/begin = \meta{text} \hfill Default: |``|
%   \end{syntax}
%   Text inserted at the beginning of \fn{textscripture} or a \env{scripture}
%   environment with the \opt{inline} option set.
% \end{option}
%
% \changes{v1.3}{2023/01/07}{Add \opt{inline/end} option}
% \begin{option}[added=2023-01-07]{inline/end}
%   \begin{syntax}
%     inline/end = \meta{text} \hfill Default: |''|
%   \end{syntax}
%   Text inserted between the end of \fn{textscripture} or a \env{scripture}
%   environment with the \opt{inline} option set and the \meta{|reference|}
%   (if specified).
% \end{option}
%
% \changes{v2.0}{2023/12/27}{Add \opt{inline/reference/format} option}
% \begin{option}[added=2023-12-27]{inline/reference/format}
%   \begin{syntax}
%     inline/reference/format = \meta{macro} \hfill Default: (\#1)
%   \end{syntax}
%   \meta{|macro|} used to format the \meta{\val{reference}} for an inline
%   \env{scripture} quotation. |#1| contains the text of the
%   \meta{\val{reference}} and \meta{\opt{version}} (if specified).
% \end{option}
%
% \changes{v2.0}{2023/12/27}{Add \opt{inline/reference/sep} option}
% \begin{option}[added=2023-12-27]{inline/reference/sep}
%   \begin{syntax}
%     inline/reference/sep = \meta{dimen} \hfill Default: 0.5em
%   \end{syntax}
%   The \meta{|dimen|} between the end of an inline \env{scripture} quotation
%   and its \meta{\val{reference}}.
% \end{option}
%
% \changes{v2.0}{2023/12/27}{Add \opt{inline/version/delim} option}
% \begin{option}[added=2023-12-27]{inline/version/delim}
%   \begin{syntax}
%     inline/version/delim = \meta{delim} \hfill Default: \{\ \}
%   \end{syntax}
%   \meta{|delim|} to use between the \meta{\val{reference}} and the
%   \meta{\opt{version}} of an inline \env{scripture} quotation.
% \end{option}
%
% \changes{v2.0}{2023/12/27}{Add \opt{inline/version/format} option}
% \begin{option}[added=2023-12-27]{inline/version/format}
%   \begin{syntax}
%     inline/version/format = \meta{macro} \hfill Default: \#1
%   \end{syntax}
%   \meta{|macro|} used to format the \meta{\opt{version}} for an inline
%   \env{scripture} quotation. |#1| contains the text of the
%   \meta{\opt{version}}.
% \end{option}
%
% \changes{v1.2}{2022/11/02}{Add \opt{language} option}
% \begin{option}[added=2022-11-02]{language}
%   \begin{syntax}
%     language = \meta{language name} \hfill Default: \emph{Empty}
%   \end{syntax}
%   \pkg{babel} or \pkg{polyglossia} \meta{|language name|} to be used for the
%   \env{scripture} environment. This calls
%   \cs{selectlanguage}|{|\meta{|language name|}|}| at the start of the
%   environment. Make sure you have \pkg{babel} or \pkg{polyglossia} loaded
%   and correctly set up for your specified language. If unset the current
%   active language is used.
%
%   Right-to-left languages are only supported with \pkg{babel} and Lua\LaTeX.
%   You will need to pass \texttt{bidi=basic, layout=lists} as options to
%   \pkg{babel} to ensure everything is laid out correctly.
% \end{option}
%
% \begin{scriptureexample}
% \begingroup
% \catcode`@=13
% \def@#1{\ifcase#1\relax \egroup \or \bgroup\textdir TLT \else
%   \bgroup\textdir TRT \fi}
% \begin{verbatim}
% \documentclass{article}
% \usepackage[bidi=basic, layout=lists]{babel}
% \babelprovide[import, main]{english}
% \babelprovide[import, mapdigits]{persian}
% \babelfont[persian]{rm}[
%   Renderer=Harfbuzz]{Amiri}
% \usepackage{scripture}
% \begin{document}
% \begin{scripture}[اِشعیا 56‏:1‏--2][version=NMV,
%     language=persian]
%                      @9@1\ch{56}@0خداوند چنین می‌فرماید:@0
%                                    \begin{poetry}
%                           @9»انصاف را نگاه داشته،@0
%                          @9عدالت را به عمل آورید،@0
%
%                         @9زیرا نجات من نزدیک شده،@0
%               @9و عدالت من به‌زودی منکشف خواهد شد.@0
%
%               @9@1\vs{2}@0خوشا به حال آن که چنین کند،@0
%                       @9و کسی که بدین متمسک گردد؛@0
%
%      @9که شَبّات را نگاه داشته، آن را بی‌حرمت نسازد،@0
%              @9و دست خویش از هر عمل بد باز دارد.«@0
%                                      \end{poetry}
% \end{scripture}
% \end{document}
% \end{verbatim}
% \endgroup
%
% \tcblower
%
% \shapemode 2
% \begin{scripture}[اِشعیا 56‏:1‏--2][version=NMV,
%     language=persian]
%   \ch{56}خداوند چنین می‌فرماید:
%   \begin{poetry}
%     «انصاف را نگاه داشته،
%     عدالت را به عمل آورید،
%
%     زیرا نجات من نزدیک شده،
%     و عدالت من به‌زودی منکشف خواهد شد.
%
%     \vs{2}خوشا به حال آن که چنین کند،
%     و کسی که بدین متمسک گردد؛
%
%     که شَبّات را نگاه داشته، آن را بی‌حرمت نسازد،
%     و دست خویش از هر عمل بد باز دارد.»
%   \end{poetry}
% \end{scripture}
% \end{scriptureexample}
%
% \textbf{Note} that for CJK scripts the \pkg{scripture} package is compatible
% with specialist packages like \pkg{luatexja} and \pkg{ctex}. These packages
% can give nicer kerning and protrusion out of the box. Although with some
% effort you can set up \pkg{babel} along with \pkg{microtype} to give
% comparable output.
%
% \begin{scriptureexample}
% \begin{verbatim}
% \documentclass{article}
% \usepackage{luatexja}
% \usepackage{scripture}
% \begin{document}
% \begin{scripture}[マルコの福音書 9:33--37][
%     version=NJB]
%   \vs{33}一行はカペナウムに着いた。イエスは家に入ってか
%          ら、弟子たちにお尋ねになった。「来る途中、何を
%          論じ合っていたのですか。」
%   \vs{34}彼らは黙っていた。来る途中、だれが一番偉いか論
%          じ合っていたからである。
%   \vs{35}イエスは腰を下ろすと、十二人を呼んで言われた。
%          「だれでも先頭に立ちたいと思う者は、皆の後にな
%          り、皆に仕える者になりなさい。」
%   \vs{36}それから、イエスは一人の子どもの手を取って、彼
%          らの真ん中に立たせ、腕に抱いて彼らに言われた。
%   \vs{37}「だれでも、このような子どもたちの一人を、わた
%          しの名のゆえに受け入れる人は、わたしを受け入れ
%          るのです。また、だれでもわたしを受け入れる人は
%          、わたしではなく、わたしを遣わされた方を受け入
%          れるのです。」
% \end{scripture}
% \end{document}
% \end{verbatim}
%
% \tcblower
%
% \enablecjk
%
% \begin{scripture}[マルコの福音書 9:33--37][
%     version=NJB]
%   \vs{33}一行はカペナウムに着いた。イエスは家に入ってか
%          ら、弟子たちにお尋ねになった。「来る途中、何を
%          論じ合っていたのですか。」
%   \vs{34}彼らは黙っていた。来る途中、だれが一番偉いか論
%          じ合っていたからである。
%   \vs{35}イエスは腰を下ろすと、十二人を呼んで言われた。
%          「だれでも先頭に立ちたいと思う者は、皆の後にな
%          り、皆に仕える者になりなさい。」
%   \vs{36}それから、イエスは一人の子どもの手を取って、彼
%          らの真ん中に立たせ、腕に抱いて彼らに言われた。
%   \vs{37}「だれでも、このような子どもたちの一人を、わた
%          しの名のゆえに受け入れる人は、わたしを受け入れ
%          るのです。また、だれでもわたしを受け入れる人は
%          、わたしではなく、わたしを遣わされた方を受け入
%          れるのです。」
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v1.2}{2022/11/02}{Add \opt{language/variant} option}
% \begin{option}[added=2022-11-02]{language/variant}
%   \begin{syntax}
%     language/variant = \meta{language variant name} \hfill Default: \emph{Empty}
%   \end{syntax}
%   \pkg{polyglossia} \meta{|language variant name|} to be used along with the
%   specified \opt{language} for the \env{scripture} environment. This inserts
%   \cs{selectlanguage}|[|\meta{|language variant name|}|]{|\meta{language
%   name}|}| at the start of the environment. Make sure you have
%   \pkg{polyglossia} loaded and correctly set up for your specified language.
% \end{option}
%
% \begin{option}{leftmargin}
%   \begin{syntax}
%     leftmargin = \meta{dimen} \hfill Default: 0pt
%   \end{syntax}
%   \meta{|dimen|} used for the left margin of the \env{scripture}
%   environment.
% \end{option}
%
% \changes{v1.2}{2022/09/01}{Add \opt{name/font} option}
% \begin{option}[added=2022-09-01]{name/font}
%   \begin{syntax}
%     name/font = \meta{font} \hfill Default: \cs{scshape}
%   \end{syntax}
%   \meta{|font|} used for the \fn{name} function.
% \end{option}
%
% \changes{v1.2}{2022/09/01}{Add \opt{name/format} option}
% \begin{option}[added=2022-09-01]{name/format}
%   \begin{syntax}
%     name/format = \meta{macro} \hfill Default: \#1
%   \end{syntax}
%   \meta{|macro|} used to format the \val{divine name} using the \fn{name}
%   function. |#1| contains the text of the argument to \fn{name}.
% \end{option}
%
% \begin{option}{noindent}
%   \begin{syntax}
%     noindent = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Whether to indent the first line of a \env{scripture} environment or not
%   by \opt{parindent}. The value of \meta{|boolean|} is optional and assumed
%   to be \val{true} if not present. This option is the opposite of
%   \opt{indent}.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[1 Peter 3:18][noindent]
%   \vs{18}For Christ also suffered once for sins,
%   the righteous for the unrighteous, to bring you
%   to God. He was put to death in the body but
%   made alive in the Spirit.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[1 Peter 3:18][noindent]
%   \vs{18}For Christ also suffered once for sins,
%   the righteous for the unrighteous, to bring you
%   to God. He was put to death in the body but
%   made alive in the Spirit.
% \end{scripture}
% \end{scriptureexample}
%
% \begin{option}{parindent}
%   \begin{syntax}
%     parindent = \meta{dimen} \hfill Default: \cs{parindent}
%   \end{syntax}
%   \meta{|dimen|} to use when indenting the first line of a paragraph in the
%   \env{scripture} environment.
% \end{option}
%
% \begin{option}{parskip}
%   \begin{syntax}
%     parskip = \meta{skip} \hfill Default: \cs{parskip}
%   \end{syntax}
%   \meta{|skip|} to use between paragraphs in the \env{scripture} environment.
% \end{option}
%
% \changes{v2.1}{2024/01/18}{Add feature to add pilcrows at the start of
% paragraphs.}
% \changes{v2.1}{2024/01/18}{Add \opt{pilcrow} option}
% \begin{option}[added=2024-01-18]{pilcrow}
%   \begin{syntax}
%     pilcrow = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Whether to insert a pilcrow (\P) at the beginning of each paragraph. This
%   option only has an effect when using the \opt{compact} and/or
%   \opt{verse/para} options. The value of \meta{|boolean|} is optional and
%   assumed to be \val{true} if not present.
%
%   A subsequent pilcrow can be suppressed with the \fn{nopilcrow} macro.
%   Inner environments start a new paragraph only if there is a blank line
%   before them and similarly, there is only a new paragraph after an inner
%   environment if it is followed by a blank line. New paragraphs are not
%   inserted within a poetry environment, so to obtain a paragraph break
%   within a block of poetry, use two \env{poetry} environments separated by a
%   blank line. The exception to this is the \env{midparachap} environment
%   which always starts and ends a paragraph.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Deuteronomy 5:1][chapter/para,
%     chapter/format=CHAPTER~#1, verse/para,
%     verse/font=\bfseries, verse/format=#1,
%     verse/sep=0.5em, pilcrow]
%   \ch{5}Moses summoned all Israel and said:
%
%   Hear, Israel, the decrees and the laws I declare
%   in your hearing today. Learn them and be sure to
%   follow them.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Deuteronomy 5:1][chapter/para,
%     chapter/format=CHAPTER~#1, verse/para,
%     verse/font=\bfseries, verse/format=#1,
%     verse/sep=0.5em, pilcrow]
%   \ch{5}Moses summoned all Israel and said:
%
%   Hear, Israel, the decrees and the laws I declare
%   in your hearing today. Learn them and be sure to
%   follow them.
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v2.1}{2024/01/18}{Add \opt{pilcrow/sep} option}
% \begin{option}[added=2024-01-18]{pilcrow/sep}
%   \begin{syntax}
%     pilcrow/sep = \meta{dimen} \hfill Default: 0.25em
%   \end{syntax}
%   \meta{|dimen|} used to separate a pilcrow (\P) from the following text.
% \end{option}
%
% \changes{v1.2}{2022/08/31}{Add \opt{redletter} option}
% \begin{option}[added=2022-08-31]{redletter}
%   \begin{syntax}
%     redletter = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Whether to enable highlighting of Jesus' words in red. The value of
%   \meta{|boolean|} is optional and assumed to be \val{true} if not present.
%   The text needs to be marked up with \fn{redletteron} and \fn{redletteroff}
%   for this option to have any effect.
% \end{option}
%
% \changes{v1.2}{2022/08/31}{Add \opt{redletter/colour} option}
% \begin{option}[added=2022-08-31]{redletter/colour, redletter/color}
%   \begin{syntax}
%     redletter/colour = \meta{colour expression} \hfill Default: red!80!black
%   \end{syntax}
%   The \pkg{l3color} \meta{|colour expression|} to be used for the words of
%   Jesus when the \opt{redletter} option is \val{true}. \fn{redletteron} and
%   \fn{redletteroff} must be used to mark up the text. \opt{redletter/color}
%   is an alias for \opt{redletter/colour}.
% \end{option}
%
% \changes{v1.3}{2023/01/08}{Add \opt{reference/align} option}
% \begin{option}[added=2023-01-08]{reference/align}
%   \begin{syntax}
%     reference/align = left \textbar\ right \hfill Default: right
%   \end{syntax}
%   Set the alignment of the reference. Note that in neither case will the
%   reference break across lines.
% \end{option}
%
% \changes{v1.2}{2022/09/07}{Add \opt{reference/colour} option}
% \begin{option}[added=2022-09-07]{reference/colour, reference/color}
%   \begin{syntax}
%     reference/colour = \meta{colour expression} \hfill Default: .
%   \end{syntax}
%   The \pkg{l3color} \meta{|colour expression|} to be used for the reference
%   and version. By default the current colour is inherited.
%   \opt{reference/color} is an alias for \opt{reference/colour}.
% \end{option}
%
% \begin{option}{reference/font}
%   \begin{syntax}
%     reference/font = \meta{font} \hfill Default: \cs{bfseries}
%   \end{syntax}
%   \meta{|font|} used when printing the \meta{\val{reference}} for a
%   \env{scripture} quotation.
% \end{option}
%
% \begin{option}{reference/format}
%   \begin{syntax}
%     reference/format = \meta{macro} \hfill Default: \#1
%   \end{syntax}
%   \meta{|macro|} used to format the \meta{\val{reference}} for a
%   \env{scripture} quotation. |#1| contains the text of the
%   \meta{\val{reference}} and
%   \meta{\opt{version}} (if specified).
% \end{option}
%
% \changes{v1.3}{2023/01/08}{Add \opt{reference/newline} option}
% \begin{option}[added=2023-01-8]{reference/newline}
%   \begin{syntax}
%     reference/newline
%   \end{syntax}
%   Always push the \meta{\val{reference}} to a newline even if there is space
%   for it to fit on the last line of the quotation. The option sets
%   \opt{reference/sep} to \cs{linewidth} so there is never room for the
%   reference on the final line of the quotation.
% \end{option}
%
% \changes{v2.1}{2024/01/10}{Add feature to place the reference at the start
% of the quotation.}
% \changes{v2.1}{2024/01/10}{Add \opt{reference/position} option}
% \begin{option}[added=2024-01-10]{reference/position}
%   \begin{syntax}
%     reference/position = start \textbar\ end \hfill Default: end
%   \end{syntax}
%   Set the position of the reference at either the start or end of the
%   quotation. If \val{start} is specified, then the reference will be set
%   inline unless the quotation begins with an inner environment. Any \fn{vs}
%   or \fn{ch} is suppressed at the start of the quotation in the main
%   \env{scripture} environment.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[John 1:1][version=NIV,
%     reference/position=start]
%   \ch{1}In the beginning was the Word, and the
%   Word was with God, and the Word was God.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[John 1:1][version=NIV,
%     reference/position=start]
%   \ch{1}In the beginning was the Word, and the
%   Word was with God, and the Word was God.
% \end{scripture}
% \end{scriptureexample}
%
% \begin{option}{reference/sep}
%   \begin{syntax}
%     reference/sep = \meta{dimen} \hfill Default: 2em
%   \end{syntax}
%   The minimum \meta{|dimen|} allowed between the end of a \env{scripture}
%   quotation and its \meta{\val{reference}} before the \meta{\val{reference}}
%   is pushed to the following line.
% \end{option}
%
% \changes{v2.1}{2024/01/10}{Add \opt{reference/start/inline} option}
% \begin{option}[added=2024-01-10]{reference/start/inline}
%   \begin{syntax}
%     reference/start/inline = \meta{boolean} \hfill Default: true
%   \end{syntax}
%   When \opt{reference/position} is set to \val{start}, this option controls
%   whether the reference is set inline or on a line of its own before the
%   quotation. Note that if the quotation begins with an inner environment the
%   reference will always be on a new line unless the \opt{compact} option is
%   also set. The value of \meta{|boolean|} is optional and assumed to be
%   \val{true} if not present. This option is the opposite of
%   \opt{reference/start/newline}.
% \end{option}
%
% \changes{v2.1}{2024/01/10}{Add \opt{reference/start/newline} option}
% \begin{option}[added=2024-01-10]{reference/start/newline}
%   \begin{syntax}
%     reference/start/newline = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   When \opt{reference/position} is set to \val{start}, this option controls
%   whether the reference is set inline or on a line of its own before the
%   quotation. Note that if the quotation begins with an inner environment the
%   reference will always be on a new line unless the \opt{compact} option is
%   also set. The value of \meta{|boolean|} is optional and assumed to be
%   \val{true} if not present. This option is the opposite of
%   \opt{reference/start/inline}.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[John 1:1]%
%     [reference/position=start,
%      reference/start/newline]
%   \ch{1}In the beginning was the Word, and the
%   Word was with God, and the Word was God.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[John 1:1]%
%     [reference/position=start,
%      reference/start/newline]
%   \ch{1}In the beginning was the Word, and the
%   Word was with God, and the Word was God.
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v2.1}{2024/01/10}{Add \opt{reference/start/sep} option}
% \begin{option}[added=2024-01-10]{reference/start/sep}
%   \begin{syntax}
%     reference/start/sep = \meta{dimen} \hfill Default: 1em
%   \end{syntax}
%   The space inserted between the reference and the quotation when
%   \opt{reference/position} is set to \val{start}. This only applies when the
%   reference is inline and not on a line of its own.
% \end{option}
%
% \changes{v2.1}{2024/01/10}{Add \opt{reference/start/vsep} option}
% \begin{option}[added=2024-01-10]{reference/start/vsep}
%   \begin{syntax}
%     reference/start/vsep = \meta{skip} \hfill Default: 0pt
%   \end{syntax}
%   The vertical skip inserted between the reference and the quotation when
%   \opt{reference/position} is set to \val{start}. This only applies when the
%   reference is on a line of its own.
% \end{option}
%
% \begin{option}{rightmargin}
%   \begin{syntax}
%     rightmargin = \meta{dimen} \hfill Default: 0pt
%   \end{syntax}
%   \meta{|dimen|} used for the right margin of the \env{scripture}
%   environment.
% \end{option}
%
% \begin{option}{selah/font}
%   \begin{syntax}
%     selah/font = \meta{font} \hfill Default: \cs{itshape}
%   \end{syntax}
%   \meta{|font|} used when printing \fn{selah} in a \env{poetry} environment.
% \end{option}
%
% \begin{option}{selah/format}
%   \begin{syntax}
%     selah/format = \meta{macro} \hfill Default: \#1
%   \end{syntax}
%   \meta{|macro|} used to format the \fn{selah} in a \env{poetry}
%   environment. |#1| contains the value of \opt{selah/text}.
% \end{option}
%
% \begin{option}{selah/sep}
%   \begin{syntax}
%     selah/sep = \meta{dimen} \hfill Default: 1em
%   \end{syntax}
%   The minimum \meta{|dimen|} allowed between the end of a poetry line and
%   \emph{Selah} before the \emph{Selah} is pushed to the following line.
% \end{option}
%
% \begin{option}{selah/text}
%   \begin{syntax}
%     selah/text = \meta{text} \hfill Default: Selah
%   \end{syntax}
%   \meta{|text|} used to for \fn{selah} in a \env{poetry} environment.
% \end{option}
%
% \changes{v2.0}{2023/12/27}{Add \opt{style} option}
% \begin{option}[added=2023/12/27]{style}
%   \begin{syntax}
%     style = \meta{name}
%   \end{syntax}
%   Set options previously saved with \fn{scripturestyle}. An error occurs if
%   the style isn't defined.
% \end{option}
%
% \changes{v1.2}{2022/08/30}{Add \opt{textright/sep} option}
% \begin{option}[added=2022-08-30]{textright/sep}
%   \begin{syntax}
%     textright/sep = \meta{dimen} \hfill Default: 1em
%   \end{syntax}
%   The minimum \meta{|dimen|} allowed between the end of a line and text
%   aligned to the right with \fn{textright} before the right aligned text is
%   pushed to the following line.
% \end{option}
%
% \changes{v2.2}{2025/03/02}{Add \opt{verse} option}
% \begin{option}[added=2025-03-02]{verse}
%   \begin{syntax}
%     verse = \meta{integer}\hfill Default: 1
%   \end{syntax}
%   Initialise the chapter number when using automatic verse numbering with
%   \cs{newvs}.
%
%   See also \opt{book} and \opt{chapter}.
% \end{option}
%
% \changes{v1.2}{2022/09/07}{Add \opt{verse/colour} option}
% \begin{option}[added=2022-09-07]{verse/colour, verse/color}
%   \begin{syntax}
%     verse/colour = \meta{colour expression} \hfill Default: .
%   \end{syntax}
%   The \pkg{l3color} \meta{|colour expression|} to be used for verse numbers.
%   By default the current colour is inherited. \opt{verse/color} is an alias
%   for \opt{verse/colour}.
% \end{option}
%
% \changes{v1.3}{2022/11/13}{Add \opt{verse/first} option}
% \begin{option}[added=2022-11-13]{verse/first}
%   \begin{syntax}
%     verse/first = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   In prose sections, print the verse number in a different format if it is
%   at the start of the paragraph. The format and separation between verse and
%   text are controlled with the \opt{verse/firstformat} and
%   \opt{verse/firstsep} options. Use \fn{nofirstverse} to suppress this at
%   the next verse (e.g., if your quote starts mid-way though a paragraph and
%   a normal verse should be printed). The value of \meta{|boolean|} is optional
%   and assumed to be true if not present.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Luke 18:25--28][noindent,
%     verse/first, version=NRSV]
%   \nofirstverse\vs{25}Indeed, it is easier for a
%   camel to go through the eye of a needle than for
%   someone who is rich to enter the kingdom of
%   God.''
%
%   \vs{26}Those who heard it said, ``Then who can
%   be saved?'' \vs{27}He replied, ``What is
%   impossible for mortals is possible for God.''
%
%   \vs{28}Then Peter said, ``Look, we have left our
%   homes and followed you.''
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Luke 18:25--28][noindent,
%     verse/first, version=NRSV]
%   \nofirstverse\vs{25}Indeed, it is easier for a
%   camel to go through the eye of a needle than for
%   someone who is rich to enter the kingdom of
%   God.''
%
%   \vs{26}Those who heard it said, ``Then who can
%   be saved?'' \vs{27}He replied, ``What is
%   impossible for mortals is possible for God.''
%
%   \vs{28}Then Peter said, ``Look, we have left our
%   homes and followed you.''
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v1.3}{2022/11/13}{Add \opt{verse/firstformat} option}
% \begin{option}[added=2022-11-13]{verse/firstformat}
%   \begin{syntax}
%     verse/firstformat = \meta{macro} \hfill Default: \#1
%   \end{syntax}
%   \meta{|macro|} used to format the first \fn{vs} in a paragraph. |#1|
%   contains the argument of \fn{vs}. Only used if \opt{verse/first} is
%   |true|.
% \end{option}
%
% \changes{v1.3}{2022/11/13}{Add \opt{verse/firstsep} option}
% \begin{option}[added=2022-11-13]{verse/firstsep}
%   \begin{syntax}
%     verse/firstsep = \meta{dimen} \hfill Default: 0.5em
%   \end{syntax}
%   \meta{|dimen|} used to separate the first \fn{vs} in a paragraph from the
%   following text. Only used if \opt{verse/first} is |true|.
% \end{option}
%
% \begin{option}{verse/font}
%   \begin{syntax}
%     verse/font = \meta{font} \hfill Default: \emph{Empty}
%   \end{syntax}
%   \meta{|font|} used for the \fn{vs} function.
% \end{option}
%
% \begin{option}{verse/format}
%   \begin{syntax}
%     verse/format = \meta{macro} \hfill Default: \cs{textsuperscript}\{\#1\}
%   \end{syntax}
%   \meta{|macro|} used to format the \fn{vs} function. |#1| contains the
%   argument of \fn{vs}.
% \end{option}
%
% \changes{v1.1}{2022/08/15}{Add \opt{verse/hide} option}
% \begin{option}[added=2022-08-15]{verse/hide}
%   \begin{syntax}
%     verse/hide = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Whether verses should be shown or hidden. The value of \meta{|boolean|} is
%   optional and assumed to be \val{true} if not present. This option is the
%   opposite of \opt{verse/show}. Note that the \hook{scripture/verse/before}
%   and \hook{scripture/verse/after} hooks are still executed when verses are
%   hidden.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Colossians 1:15--16][verse/hide]
%   \vs{15}The Son is the image of the invisible
%   God, the firstborn over all creation.
%   \vs{16}For in him all things were created:
%   things in heaven and on earth, visible and
%   invisible, whether thrones or powers or rulers
%   or authorities; all things have been created
%   through him and for him.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Colossians 1:15--16][verse/hide]
%   \vs{15}The Son is the image of the invisible
%   God, the firstborn over all creation.
%   \vs{16}For in him all things were created:
%   things in heaven and on earth, visible and
%   invisible, whether thrones or powers or rulers
%   or authorities; all things have been created
%   through him and for him.
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v2.1}{2024/01/13}{Add feature to set each verse on a new line.}
% \changes{v2.1}{2024/01/13}{Add \opt{verse/para} option}
% \begin{option}[added=2024-01-13]{verse/para}
%   \begin{syntax}
%     verse/para = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Whether to set each verse on its own line. The value of \meta{|boolean|}
%   is optional and assumed to be \val{true} if not present. Drop chapters and
%   the shape of inner environments is preserved with this option unless the
%   \opt{compact} option is also set.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Jonah 1:17--2:2a][verse/para,
%     verse/sep=0.5em, pilcrow, chapter/para,
%     chapter/format=CHAPTER~#1]
%   \begin{midparachap}
%     \vs{17}Now the \name{Lord} provided a huge
%     fish to swallow Jonah, and Jonah was in the
%     belly of the fish three days and three
%     nights. \ch{2}From inside the fish Jonah
%     prayed to the \name{Lord} his God. \vs{2}He
%     said:
%   \end{midparachap}
%
%   \begin{poetry}
%     `In my distress I called to the \name{Lord},
%     and he answered me.
%   \end{poetry}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Jonah 1:17--2:2a][verse/para,
%     verse/format=#1, verse/font=\bfseries,
%     verse/sep=0.5em, pilcrow, chapter/para,
%     chapter/format=CHAPTER~#1]
%   \begin{midparachap}
%     \vs{17}Now the \name{Lord} provided a huge
%     fish to swallow Jonah, and Jonah was in the
%     belly of the fish three days and three
%     nights. \ch{2}From inside the fish Jonah
%     prayed to the \name{Lord} his God. \vs{2}He
%     said:
%   \end{midparachap}
%
%   \begin{poetry}
%     `In my distress I called to the \name{Lord},
%     and he answered me.
%   \end{poetry}
% \end{scripture}
% \end{scriptureexample}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Jonah 1:17--2:2a][verse/para,
%     verse/sep=0.5em, pilcrow, chapter/para,
%     chapter/format=CHAPTER~#1, compact]
%   \begin{midparachap}
%     \vs{17}Now the \name{Lord} provided a huge
%     fish to swallow Jonah, and Jonah was in the
%     belly of the fish three days and three
%     nights. \ch{2}From inside the fish Jonah
%     prayed to the \name{Lord} his God. \vs{2}He
%     said:
%   \end{midparachap}
%
%   \begin{poetry}
%     `In my distress I called to the \name{Lord},
%     and he answered me.
%   \end{poetry}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Jonah 1:17--2:2a][verse/para,
%     verse/format=#1, verse/font=\bfseries,
%     verse/sep=0.5em, pilcrow, chapter/para,
%     chapter/format=CHAPTER~#1, compact]
%   \begin{midparachap}
%     \vs{17}Now the \name{Lord} provided a huge
%     fish to swallow Jonah, and Jonah was in the
%     belly of the fish three days and three
%     nights. \ch{2}From inside the fish Jonah
%     prayed to the \name{Lord} his God. \vs{2}He
%     said:
%   \end{midparachap}
%
%   \begin{poetry}
%     `In my distress I called to the \name{Lord},
%     and he answered me.
%   \end{poetry}
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v1.1}{2022/07/28}{Add \opt{verse/sep} option with small default}
% \begin{option}[added=2022-07-28]{verse/sep}
%   \begin{syntax}
%     verse/sep = \meta{dimen} \hfill Default: 0.05em
%   \end{syntax}
%   \meta{|dimen|} used to separate a \fn{vs} from the following text.
% \end{option}
%
% \changes{v1.1}{2022/08/15}{Add \opt{verse/show} option}
% \begin{option}[added=2022-08-15]{verse/show}
%   \begin{syntax}
%     verse/show = \meta{boolean} \hfill Default: true
%   \end{syntax}
%   Whether verses should be shown or hidden. The value of \meta{|boolean|}
%   is optional and assumed to be \val{true} if not present. This option is
%   the opposite of \opt{verse/hide}.
% \end{option}
%
% \begin{option}{version}
%   \begin{syntax}
%     version = \meta{version} \hfill Default: \emph{Empty}
%   \end{syntax}
%   \meta{\opt{version}} added to the \meta{\val{reference}} for a
%   \env{scripture} quotation.
% \end{option}
%
% \begin{option}{version/delim}
%   \begin{syntax}
%     version/delim = \meta{delim} \hfill Default: \{\ \}
%   \end{syntax}
%   \meta{|delim|} to use between the \meta{\val{reference}} and the
%   \meta{\opt{version}} of a \env{scripture} quotation.
% \end{option}
%
% \begin{option}{version/format}
%   \begin{syntax}
%     version/format = \meta{macro} \hfill Default: (\#1)
%   \end{syntax}
%   \meta{|macro|} used to format the \meta{\opt{version}} for a
%   \env{scripture} quotation. |#1| contains the text of the
%   \meta{\opt{version}}.
% \end{option}
%
% \changes{v2.1}{2024/01/10}{Add \opt{version/position} option}
% \begin{option}[added=2024-01-10]{version/position}
%   \begin{syntax}
%     version/position = withref \textbar\ end \hfill Default: withref
%   \end{syntax}
%   Set the position of the version at either with the reference or at the end
%   of the quotation if \opt{reference/position} is set to \val{start}.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[John 1:1][version=NIV,
%     reference/position=start,
%     version/position=end]
%   \ch{1}In the beginning was the Word, and the
%   Word was with God, and the Word was God.
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[John 1:1][version=NIV,
%     reference/position=start,
%     version/position=end]
%   \ch{1}In the beginning was the Word, and the
%   Word was with God, and the Word was God.
% \end{scripture}
% \end{scriptureexample}
%
% \subsubsection{Options for the \env{center} environment}
% \label{centeroptions}
%
% If these options are passed directly to the \env{center} environment rather
% than to the package, \fn{scripturesetup} or the \env{scripture} environment,
% then the |center/| prefix should be dropped.
%
% \begin{option}{center/aboveskip}
%   \begin{syntax}
%     center/aboveskip = \meta{skip} \hfill Default: \cs{medskipamount}
%   \end{syntax}
%   \meta{|skip|} inserted above the \env{center} environment.
% \end{option}
%
% \begin{option}{center/belowskip}
%   \begin{syntax}
%     center/belowskip = \meta{skip} \hfill Default: \cs{medskipamount}
%   \end{syntax}
%   \meta{|skip|} inserted below the \env{center} environment.
% \end{option}
%
% \begin{option}{center/leftmargin}
%   \begin{syntax}
%     center/leftmargin = \meta{dimen} \hfill Default: 0pt
%   \end{syntax}
%   \meta{|dimen|} used for the left margin of the \env{center} environment.
% \end{option}
%
% \begin{option}{center/rightmargin}
%   \begin{syntax}
%     center/rightmargin = \meta{dimen} \hfill Default: 0pt
%   \end{syntax}
%   \meta{|dimen|} used for the right margin of the \env{center} environment.
% \end{option}
%
% \subsubsection{Options for the \env{flushright} environment}
% \label{flushrightoptions}
%
% If these options are passed directly to the \env{flushright} environment rather
% than to the package, \fn{scripturesetup} or the \env{scripture} environment,
% then the |flushright/| prefix should be dropped.
%
% \begin{option}{flushright/aboveskip}
%   \begin{syntax}
%     flushright/aboveskip = \meta{skip} \hfill Default: \cs{medskipamount}
%   \end{syntax}
%   \meta{|skip|} inserted above the \env{flushright} environment.
% \end{option}
%
% \begin{option}{flushright/belowskip}
%   \begin{syntax}
%     flushright/belowskip = \meta{skip} \hfill Default: \cs{medskipamount}
%   \end{syntax}
%   \meta{|skip|} inserted below the \env{flushright} environment.
% \end{option}
%
% \begin{option}{flushright/leftmargin}
%   \begin{syntax}
%     flushright/leftmargin = \meta{dimen} \hfill Default: 0pt
%   \end{syntax}
%   \meta{|dimen|} used for the left margin of the \env{flushright} environment.
% \end{option}
%
% \begin{option}{flushright/rightmargin}
%   \begin{syntax}
%     flushright/rightmargin = \meta{dimen} \hfill Default: 0pt
%   \end{syntax}
%   \meta{|dimen|} used for the right margin of the \env{flushright} environment.
% \end{option}
%
% \subsubsection{Options for the \env{hanging} environment}
% \label{hangingoptions}
%
% If these options are passed directly to the \env{hanging} environment rather
% than to the package, \fn{scripturesetup} or the \env{scripture} environment,
% then the |hanging/| prefix should be dropped.
%
% \begin{option}{hanging/aboveskip}
%   \begin{syntax}
%     hanging/aboveskip = \meta{skip} \hfill Default: \cs{medskipamount}
%   \end{syntax}
%   \meta{|skip|} inserted above the \env{hanging} environment.
% \end{option}
%
% \begin{option}{hanging/belowskip}
%   \begin{syntax}
%     hanging/belowskip = \meta{skip} \hfill Default: \cs{medskipamount}
%   \end{syntax}
%   \meta{|skip|} inserted below the \env{hanging} environment.
% \end{option}
%
% \changes{v2.1}{2024/12/31}{Add \opt{hanging/chapter/indent} option}
% \begin{option}[added=2024-12-31]{hanging/chapter/indent}
%   \begin{syntax}
%     hanging/chapter/indent = \meta{boolean} \hfill Default: true
%   \end{syntax}
%   Indent the first line of chapters in \env{hanging} environments. If this
%   is set to \val{false}, then the paragraph will be set has a normal hanging
%   paragraph (if there is room).
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Genesis 1:1--3][%
%     hanging/chapter/indent=false]
%   \begin{hanging}
%     \ch{1}In the beginning God created the heavens
%     and the earth. \vs{2}Now the earth was
%     formless and empty, darkness was over the
%     surface of the deep, and the Spirit of God was
%     hovering over the waters.
%
%     \vs{3}And God said, ``Let there be light,''
%     and there was light.
%   \end{hanging}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Genesis 1:1--3][%
%     hanging/chapter/indent=false]
%   \begin{hanging}
%     \ch{1}In the beginning God created the heavens
%     and the earth. \vs{2}Now the earth was
%     formless and empty, darkness was over the
%     surface of the deep, and the Spirit of God was
%     hovering over the waters.
%
%     \vs{3}And God said, ``Let there be light,''
%     and there was light.
%   \end{hanging}
% \end{scripture}
% \end{scriptureexample}
%
% \begin{option}{hanging/hang}
%   \begin{syntax}
%     hanging/hang = \meta{dimen} \hfill Default: 2em
%   \end{syntax}
%   \meta{|dimen|} used for the indent of subsequent lines of the
%   \env{hanging} environment.
% \end{option}
%
% \begin{option}{hanging/leftmargin}
%   \begin{syntax}
%     hanging/leftmargin = \meta{dimen} \hfill Default: 1em
%   \end{syntax}
%   \meta{|dimen|} used for the left margin of the \env{hanging} environment.
% \end{option}
%
% \begin{option}{hanging/rightmargin}
%   \begin{syntax}
%     hanging/rightmargin = \meta{dimen} \hfill Default: 1em
%   \end{syntax}
%   \meta{|dimen|} used for the right margin of the \env{hanging} environment.
% \end{option}
%
% \changes{v2.1}{2024/12/17}{Add \opt{hanging/verse/left} option}
% \begin{option}[added=2024-12-17]{hanging/verse/left}
%   \begin{syntax}
%     hanging/verse/left = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Align verse numbers in \env{hanging} environments at the left margin of
%   the \env{hanging} environment. This is only used for verses at the start
%   of a paragraph. This option is the opposite of \opt{hanging/verse/right}.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \documentclass{article}
% \usepackage{babel}
% \babelprovide[import, main]{english}
% \babelprovide[import,
%   onchar=ids fonts]{ancientgreek}
% \babelfont[ancientgreek]{rm}[
%   BoldFont=NewCM10-Bold]{NewCM10-Regular}
% \usepackage{scripture}
% \begin{document}
% \begin{scripture}[Κατά Μάρκον 1:28--30][
%     hanging/hang=1em, hanging/leftmargin=2em,
%     hanging/verse/left, hanging/verse/sep=1em,
%     language=ancientgreek, verse/sep=0.25em,
%     verse/font=\sffamily\bfseries, version=THGNT]
%   \begin{hanging}
%     \vs{28}Καὶ ἐξῆλθεν ἡ ἀκοὴ αὐτοῦ εὐθὺς πανταχοῦ
%     εἰς ὅλην τὴν περίχωρον τῆς Γαλιλαίας.
%
%     \vs{29}Καὶ εὐθὺς ἐκ τῆς συναγωγῆς ἐξελθόντες
%     ἦλθον εἰς τὴν οἰκίαν Σίμωνος καὶ Ἀνδρέου μετὰ
%     Ἰακώβου καὶ Ἰωάννου. \vs{30}ἡ δὲ πενθερὰ
%     Σίμωνος κατέκειτο πυρέσσουσα, καὶ εὐθὺς
%     λέγουσιν αὐτῷ περὶ αὐτῆς.
%   \end{hanging}
% \end{scripture}
% \end{document}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Κατά Μάρκον 1:28--30][
%     hanging/hang=1em, hanging/leftmargin=2em,
%     hanging/verse/left, hanging/verse/sep=1em,
%     language=ancientgreek, verse/sep=0.25em,
%     verse/font=\sffamily\bfseries, version=THGNT]
%   \begin{hanging}
%     \vs{28}Καὶ ἐξῆλθεν ἡ ἀκοὴ αὐτοῦ εὐθὺς πανταχοῦ
%     εἰς ὅλην τὴν περίχωρον τῆς Γαλιλαίας.
%
%     \vs{29}Καὶ εὐθὺς ἐκ τῆς συναγωγῆς ἐξελθόντες
%     ἦλθον εἰς τὴν οἰκίαν Σίμωνος καὶ Ἀνδρέου μετὰ
%     Ἰακώβου καὶ Ἰωάννου. \vs{30}ἡ δὲ πενθερὰ
%     Σίμωνος κατέκειτο πυρέσσουσα, καὶ εὐθὺς
%     λέγουσιν αὐτῷ περὶ αὐτῆς.
%   \end{hanging}
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v2.1}{2024/12/17}{Add \opt{hanging/verse/right} option}
% \begin{option}[added=2024-12-17]{hanging/verse/right}
%   \begin{syntax}
%     hanging/verse/right = \meta{boolean} \hfill Default: true
%   \end{syntax}
%   Align verse numbers in \env{hanging} environments at the left margin of
%   the \env{hanging} environment. The verse numbers overlap to the left. This
%   is only used for verses at the start of a paragraph. This option is the
%   opposite of \opt{hanging/verse/left}.
% \end{option}
%
% \changes{v2.1}{2024/12/17}{Add \opt{hanging/verse/sep} option}
% \begin{option}[added=2024-12-17]{hanging/verse/sep}
%   \begin{syntax}
%     hanging/verse/sep = \meta{dimen} \hfill Default: 0.05em
%   \end{syntax}
%   \meta{|dimen|} used to separate a \fn{vs} from the following text in a
%   \env{hanging} environment. This is only used for verses at the start of a
%   paragraph.
% \end{option}
%
% \subsubsection{Options for the \env{midparachap} environment}
% \label{midparachapoptions}
%
% If these options are passed directly to the \env{midparachap} environment
% rather than to the package, \fn{scripturesetup} or the \env{scripture}
% environment, then the |midparachap/| prefix should be dropped.
%
% \begin{option}{midparachap/hideverse}
%   \begin{syntax}
%     midparachap/hideverse = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Whether a \fn{vs}|{1}| should automatically be inserted after a \fn{ch}
%   when the \fn{ch} occurs mid-paragraph. This also affects \fn{ch} in
%   \env{poetry} environments. The value of \meta{|boolean|} is optional and
%   assumed to be \val{true} if not present. This option is the opposite of
%   \opt{midparachap/showverse}. See also \opt{chapter/showverse}.
% \end{option}
%
% \begin{scriptureexample}
% \begin{verbatim}
% \begin{scripture}[Hosea 11:12--12:1]%
%     [midparachap/hideverse]
%   \begin{poetry}
%     \vs{12}Ephraim has surrounded me with lies,
%     Israel with deceit.
%
%     And Judah is unruly against God,
%     even against the faithful Holy One.
%
%     \ch{12}Ephraim feeds on the wind;
%     he pursues the east wind all day
%     and multiplies lies and violence.
%
%     He makes a treaty with Assyria
%     and sends olive oil to Egypt.
%   \end{poetry}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Hosea 11:12--12:1]%
%     [midparachap/hideverse]
%   \begin{poetry}
%     \vs{12}Ephraim has surrounded me with lies,
%     Israel with deceit.
%
%     And Judah is unruly against God,
%     even against the faithful Holy One.
%
%     \ch{12}Ephraim feeds on the wind;
%     he pursues the east wind all day
%     and multiplies lies and violence.
%
%     He makes a treaty with Assyria
%     and sends olive oil to Egypt.
%   \end{poetry}
% \end{scripture}
% \end{scriptureexample}
%
% \begin{option}{midparachap/showverse}
%   \begin{syntax}
%     midparachap/showverse = \meta{boolean} \hfill Default: true
%   \end{syntax}
%   Whether a \fn{vs}|{1}| should automatically be inserted after a \fn{ch}
%   when the \fn{ch} occurs mid-paragraph. This also affects \fn{ch} in
%   \env{poetry} environments. The value of \meta{|boolean|} is optional and
%   assumed to be \val{true} if not present. This option is the opposite of
%   \opt{midparachap/hideverse}. See also \opt{chapter/showverse}.
% \end{option}
%
% \subsubsection{Options for the \env{narrow} environment}
% \label{narrowoptions}
%
% If these options are passed directly to the \env{narrow} environment rather
% than to the package, \fn{scripturesetup} or the \env{scripture} environment,
% then the |narrow/| prefix should be dropped.
%
% \begin{option}{narrow/aboveskip}
%   \begin{syntax}
%     narrow/aboveskip = \meta{skip} \hfill Default: \cs{medskipamount}
%   \end{syntax}
%   \meta{|skip|} inserted above the \env{narrow} environment.
% \end{option}
%
% \begin{option}{narrow/belowskip}
%   \begin{syntax}
%     narrow/belowskip = \meta{skip} \hfill Default: \cs{medskipamount}
%   \end{syntax}
%   \meta{|skip|} inserted below the \env{narrow} environment.
% \end{option}
%
% \begin{option}{narrow/leftmargin}
%   \begin{syntax}
%     narrow/leftmargin = \meta{dimen} \hfill Default: 1em
%   \end{syntax}
%   \meta{|dimen|} used for the left margin of the \env{narrow} environment.
% \end{option}
%
% \begin{option}{narrow/rightmargin}
%   \begin{syntax}
%     narrow/rightmargin = \meta{dimen} \hfill Default: 1em
%   \end{syntax}
%   \meta{|dimen|} used for the right margin of the \env{narrow} environment.
% \end{option}
%
% \subsubsection{Options for the \env{poetry} environment}
% \label{poetryoptions}
%
% If these options are passed directly to the \env{poetry} environment rather
% than to the package, \fn{scripturesetup} or the \env{scripture} environment,
% then the |poetry/| prefix should be dropped.
%
% \begin{option}{poetry/aboveskip}
%   \begin{syntax}
%     poetry/aboveskip = \meta{skip} \hfill Default: \cs{medskipamount}
%   \end{syntax}
%   \meta{|skip|} inserted above the \env{poetry} environment.
% \end{option}
%
% \begin{option}{poetry/belowskip}
%   \begin{syntax}
%     poetry/belowskip = \meta{skip} \hfill Default: \cs{medskipamount}
%   \end{syntax}
%   \meta{|skip|} inserted below the \env{poetry} environment.
% \end{option}
%
% \begin{option}{poetry/bigindent}
%   \begin{syntax}
%     poetry/bigindent = \meta{dimen} \hfill Default: 4em
%   \end{syntax}
%   \meta{|dimen|} used for the indent subsequent lines of a line of poetry in
%   a \env{poetry} environment if it needs to flow on to the following line.
% \end{option}
%
% \begin{option}{poetry/indent}
%   \begin{syntax}
%     poetry/indent = \meta{dimen} \hfill Default: 1em
%   \end{syntax}
%   \meta{|dimen|} used for the second half of a line of poetry in a
%   \env{poetry} environment.
% \end{option}
%
% \begin{option}{poetry/leftmargin}
%   \begin{syntax}
%     poetry/leftmargin = \meta{dimen} \hfill Default: 1em
%   \end{syntax}
%   \meta{|dimen|} used for the left margin of the \env{poetry} environment.
% \end{option}
%
% \begin{option}{poetry/rightmargin}
%   \begin{syntax}
%     poetry/rightmargin = \meta{dimen} \hfill Default: 0pt
%   \end{syntax}
%   \meta{|dimen|} used for the right margin of the \env{poetry} environment.
% \end{option}
%
% \changes{v1.1}{2022/07/31}{Add \opt{poetry/verse/left} option}
% \begin{option}[added=2022-07-31]{poetry/verse/left}
%   \begin{syntax}
%     poetry/verse/left = \meta{boolean} \hfill Default: false
%   \end{syntax}
%   Align verse numbers in \env{poetry} environments at the left margin of the
%   \env{scripture} environment. This option is the opposite of
%   \opt{poetry/verse/right}.
% \end{option}
%
% \begin{scriptureexample}[lefthand ratio=0.65]
% \begin{verbatim}
% \begin{scripture}[Acts 15:15--18]%
%     [poetry/leftmargin=2em, poetry/verse/left]
%   \vs{15}The words of the prophets are in
%   agreement with this, as it is written:
%   \begin{poetry}
%     \vs{16}`\thinspace``After this I will return
%     and rebuild David's fallen tent.
%
%     Its ruins I will rebuild,
%     and I will restore it,
%
%     \vs{17}that the rest of mankind may seek the Lord,
%     even all the Gentiles who bear my name,
%
%     says the Lord, who does these things''---
%     \vs{18}things known from long ago.
%   \end{poetry}
% \end{scripture}
% \end{verbatim}
%
% \tcblower
%
% \begin{scripture}[Acts 15:15--18]%
%     [poetry/leftmargin=2em, poetry/verse/left]
%   \vs{15}The words of the prophets are in
%   agreement with this, as it is written:
%   \begin{poetry}
%     \vs{16}`\thinspace``After this I will return
%     and rebuild David's fallen tent.
%
%     Its ruins I will rebuild,
%     and I will restore it,
%
%     \vs{17}that the rest of mankind may seek the Lord,
%     even all the Gentiles who bear my name,
%
%     says the Lord, who does these things''---
%     \vs{18}things known from long ago.
%   \end{poetry}
% \end{scripture}
% \end{scriptureexample}
%
% \changes{v1.1}{2022/07/31}{Add \opt{poetry/verse/right} option}
% \begin{option}[added=2022-07-31]{poetry/verse/right}
%   \begin{syntax}
%     poetry/verse/right = \meta{boolean} \hfill Default: true
%   \end{syntax}
%   Align verse numbers in \env{poetry} environments at the left margin of the
%   poetry environment. The verse numbers overlap to the left. This option is
%   the opposite of \opt{poetry/verse/left}.
% \end{option}
%
% \changes{v1.1}{2022/07/31}{Add \opt{poetry/verse/sep} option}
% \begin{option}[added=2022-07-31]{poetry/verse/sep}
%   \begin{syntax}
%     poetry/verse/sep = \meta{dimen} \hfill Default: 0.05em
%   \end{syntax}
%   \meta{|dimen|} used to separate a \fn{vs} from the following text in a
%   \env{poetry} environment. This is only used for verses at the start of a
%   line.
% \end{option}
%
% \end{documentation}
%
% \begin{implementation}
% 
% \section{Implementation}
%
%    \begin{macrocode}
%<*package>
%<@@=scripture>
%    \end{macrocode}
%
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[2022-11-01]
\ProvidesExplPackage{scripture}{2025/08/09}{2.2}
  {Format Scripture Quotations (DCP)}
%    \end{macrocode}
%
% \subsection{Hacks and workarounds}
%
% Work around odd interaction between \cs{textdir} and display math. See
% \url{https://tex.stackexchange.com/q/716621/87678}.
%
%    \begin{macrocode}
\bool_new:N \l_@@_textdir_change_in_group_bool
\cs_new_protected:Nn \@@_set_textdirection:
  {
    \sys_if_engine_luatex:T
      {
        \textdirection \int_use:N \textdirection
        \bool_set_true:N \l_@@_textdir_change_in_group_bool
      }
  }
%    \end{macrocode}
%
% \subsection{Messages}
%
% \env{scripture} environments along with all internal environments can not be
% nested.
%
%    \begin{macrocode}
\msg_new:nnnn { scripture } { nested-environment }
  { Nesting~of~scripture~environments~not~supported. }
  { You~have~tried~to~nest~a~scripture~environment~or \\
    one~of~its~internal~environments,~which~is~not~supported. }
%    \end{macrocode}
%
% Make sure \pkg{polyglossia} languages and variants are set up.
%
%    \begin{macrocode}
\msg_new:nnnn { scripture } { language-error }
  { Language~`#1'~not~set~up. }
  { Language~`#1'~has~not~been~set~up.~Make~sure~you~set~up~languages~
    before~using~the~language~option~of~the~scripture~environment. }
%    \end{macrocode}
%
% Warn if a \opt{language} is requested and neither \pkg{babel} nor
% \pkg{polyglossia} is loaded.
%
%    \begin{macrocode}
\msg_new:nnnn { scripture } { language-warning }
  { Language~requested~without~support. }
  { You~have~requested~language=#1,~but~neither~babel~nor~polyglossia~
    have~been~loaded~and~set~up.~Ignoring~option~language=#1. }
%    \end{macrocode}
%
% Error if an \fn{heading} is not used in the main \env{scripture}
% environment.
%
%    \begin{macrocode}
\msg_new:nnnn { scripture } { heading-error }
  { \token_to_str:N \heading \c_space_tl not~support~within~inner~ 
    environments. }
  { You~have~tried~to~use~\token_to_str:N \heading \c_space_tl within~the~
    `#1'~environment,~but~this~macro~is~only~supported~in~the~main~
    `scripture'~environment. }
%    \end{macrocode}
%
% Error if an unknown \opt{style} is requested.
%
%    \begin{macrocode}
\msg_new:nnnn { scripture } { unknown-style }
  { Style~#1~not~defined. }
  { You~have~requested~style=#1,~but~it~has~not~been~defined.~
    You~can~define~it~using~\token_to_str:N \scripturestyle.~
    Ignoring~option~style=#1. }
%    \end{macrocode}
%
% \subsection{Options}
%
% Key-value settings for the \env{scripture} environment and its inner
% environments.
%    \begin{macrocode}
\keys_define:nn { scripture }
  {
    , aboveskip                   .tl_set:N           = \l_@@_aboveskip_tl
    , aboveskip                   .value_required:n   = true
    , aboveskip                   .initial:n          = \c_zero_skip
    , added / font                .tl_set:N           = \l_@@_added_font_tl
    , added / font                .value_required:n   = true
    , added / font                .initial:n          =
    , added / format              .cs_set:Np          = \@@_added_format:n #1
    , added / format              .value_required:n   = true
    , added / format              .initial:n          = \emph { #1 }
    , after                       .tl_set:N           = \l_@@_after_tl
    , after                       .value_required:n   = true
    , after                       .initial:n          =
    , before                      .tl_set:N           = \l_@@_before_tl
    , before                      .value_required:n   = true
    , before                      .initial:n          =
    , belowskip                   .tl_set:N           = \l_@@_belowskip_tl
    , belowskip                   .value_required:n   = true
    , belowskip                   .initial:n          = \c_zero_skip
    , book                        .tl_gset:N          = \g_@@_book_tl
    , book                        .value_required:n   = true
    , book                        .initial:n          =
    , colour                      .tl_set:N           = \l_@@_colour_tl
    , colour                      .value_required:n   = true
    , colour                      .initial:n          = .
    , color                       .meta:n             = { colour = { #1 } }
    , compact                     .bool_set:N         = \l_@@_compact_bool
    , compact                     .default:n          = true
    , compact                     .initial:n          = false
    , chapter                     .int_gset:N         = \g_@@_chapter_int
    , chapter                     .value_required:n   = true
    , chapter                     .initial:n          = \c_one_int
    , chapter / align             .choices:nn         = { left, right }
                                                        {
                                                          \tl_if_exist:NF \l_@@_chapter_align_tl
                                                            { \tl_new:N \l_@@_chapter_align_tl }
                                                          \str_case:Vn \l_keys_choice_tl
                                                            {
                                                              { left }
                                                                {
                                                                  \tl_set:Nn \l_@@_chapter_align_tl
                                                                    { l }
                                                                }
                                                              { right }
                                                                {
                                                                  \tl_set:Nn \l_@@_chapter_align_tl
                                                                    { r }
                                                                }
                                                            }
                                                        }
    , chapter / align             .value_required:n   = true
    , chapter / align             .initial:n          = left
    , chapter / font              .tl_set:N           = \l_@@_chap_font_tl
    , chapter / font              .value_required:n   = true
    , chapter / font              .initial:n          = \bfseries
    , chapter / colour            .tl_set:N           = \l_@@_chapter_colour_tl
    , chapter / colour            .value_required:n   = true
    , chapter / colour            .initial:n          = .
    , chapter / color             .meta:n             = { chapter / colour = { #1 } }
    , chapter / drop              .bool_set:N         = \l_@@_chap_drop_bool
    , chapter / drop              .default:n          = true
    , chapter / drop              .initial:n          = true
    , chapter / format            .cs_set:Np          = \@@_chap_format:n #1
    , chapter / format            .value_required:n   = true
    , chapter / format            .initial:n          = #1
    , chapter / hide              .bool_set_inverse:N = \l_@@_chap_show_bool
    , chapter / hide              .default:n          = true
    , chapter / nodrop            .bool_set_inverse:N = \l_@@_chap_drop_bool
    , chapter / nodrop            .default:n          = true
    , chapter / para              .bool_set:N         = \l_@@_chap_para_bool
    , chapter / para              .default:n          = true
    , chapter / para              .initial:n          = false
    , chapter / para / aboveskip  .tl_set:N           = \l_@@_chap_para_aboveskip_tl
    , chapter / para / aboveskip  .value_required:n   = true
    , chapter / para / aboveskip  .initial:n          = \bigskipamount
    , chapter / para / belowskip  .tl_set:N           = \l_@@_chap_para_belowskip_tl
    , chapter / para / belowskip  .value_required:n   = true
    , chapter / para / belowskip  .initial:n          = \medskipamount
    , chapter / para / indent     .code:n             = {
                                                          \bool_set:Nn
                                                            \l_@@_chap_para_afterindent_bool
                                                            { \str_if_eq_p:nn { #1 } { true } }
                                                        }
    , chapter / para / indent     .default:n          = true
    , chapter / para / indent     .initial:n          = true
    , chapter / sep               .tl_set:N           = \l_@@_chap_sep_tl
    , chapter / sep               .value_required:n   = true
    , chapter / sep               .initial:n          = 0.5em
    , chapter / show              .bool_set:N         = \l_@@_chap_show_bool
    , chapter / show              .default:n          = true
    , chapter / show              .initial:n          = true
    , chapter / showverse         .bool_set:N         = \l_@@_chap_show_verse_bool
    , chapter / showverse         .default:n          = true
    , chapter / showverse         .initial:n          = false
    , chapter / smash             .bool_set:N         = \l_@@_chap_smash_bool
    , chapter / smash             .default:n          = true
    , chapter / smash             .initial:n          = false
    , chapter / valign            .choices:nn         = { bottom, middle, top }
                                                        {
                                                          \tl_if_exist:NF \l_@@_chapter_valign_tl
                                                            { \tl_new:N \l_@@_chapter_valign_tl }
                                                          \str_case:Vn \l_keys_choice_tl
                                                            {
                                                              { bottom }
                                                                {
                                                                  \tl_set:Nn \l_@@_chapter_valign_tl
                                                                    { b }
                                                                }
                                                              { middle }
                                                                {
                                                                  \tl_set:Nn \l_@@_chapter_valign_tl
                                                                    { vc }
                                                                }
                                                              { top }
                                                                {
                                                                  \tl_set:Nn \l_@@_chapter_valign_tl
                                                                    { t }
                                                                }
                                                            }
                                                        }
    , chapter / valign            .value_required:n   = true
    , chapter / valign            .initial:n          = bottom
    , chapter / xchar             .tl_set:N           = \l_@@_X_char_tl
    , chapter / xchar             .value_required:n   = true
    , chapter / xchar             .initial:n          = X
    , defaults                    .code:n             = \cs_if_exist_use:N \@@_setup_reset_defaults:
    , defaults                    .value_forbidden:n  = true
    , extraskip                   .tl_set:N           = \l_@@_extraskip_tl
    , extraskip                   .value_required:n   = true
    , extraskip                   .initial:n          = \medskipamount
    , font                        .tl_set:N           = \l_@@_font_tl
    , font                        .value_required:n   = true
    , font                        .initial:n          =
    , heading / aboveskip         .tl_set:N           = \l_@@_heading_aboveskip_tl
    , heading / aboveskip         .value_required:n   = true
    , heading / aboveskip         .initial:n          = \bigskipamount
    , heading / afterindent       .bool_set:N         = \l_@@_heading_afterindent_bool
    , heading / afterindent       .default:n          = true
    , heading / afterindent       .initial:n          = false
    , heading / align             .choices:nn         = { left, right, center }
                                                        {
                                                          \tl_if_exist:NF \l_@@_heading_align_tl
                                                            { \tl_new:N \l_@@_heading_align_tl }
                                                          \str_case:Vn \l_keys_choice_tl
                                                            {
                                                              { left }
                                                                {
                                                                  \tl_set:Nn \l_@@_heading_align_tl
                                                                    { \raggedright }
                                                                }
                                                              { right }
                                                                {
                                                                  \tl_set:Nn \l_@@_heading_align_tl
                                                                    { \raggedleft }
                                                                }
                                                              { center }
                                                                {
                                                                  \tl_set:Nn \l_@@_heading_align_tl
                                                                    { \centering }
                                                                }
                                                            }
                                                        }
    , heading / align             .value_required:n   = true
    , heading / align             .initial:n          = left
    , heading / belowskip         .tl_set:N           = \l_@@_heading_belowskip_tl
    , heading / belowskip         .value_required:n   = true
    , heading / belowskip         .initial:n          = \medskipamount
    , heading / font              .tl_set:N           = \l_@@_heading_font_tl
    , heading / font              .value_required:n   = true
    , heading / font              .initial:n          = \small\itshape
    , heading / format            .cs_set:Np          = \@@_heading_format:n #1
    , heading / format            .value_required:n   = true
    , heading / format            .initial:n          = #1
    , heading / hide              .bool_set_inverse:N = \l_@@_heading_show_bool
    , heading / hide              .default:n          = true
    , heading / show              .bool_set:N         = \l_@@_heading_show_bool
    , heading / show              .default:n          = true
    , heading / show              .initial:n          = true
    , indent                      .bool_set:N         = \l_@@_indent_bool
    , indent                      .default:n          = true
    , indent                      .initial:n          = true
    , inline                      .bool_set:N         = \l_@@_inline_bool
    , inline                      .default:n          = true
    , inline                      .initial:n          = false
    , inline / begin              .tl_set:N           = \l_@@_inline_begin_tl
    , inline / begin              .value_required:n   = true
    , inline / begin              .initial:n          = ``
    , inline / end                .tl_set:N           = \l_@@_inline_end_tl
    , inline / end                .value_required:n   = true
    , inline / end                .initial:n          = ''
    , inline / reference / format .cs_set:Np          = \@@_inline_ref_format:n #1
    , inline / reference / format .value_required:n   = true
    , inline / reference / format .initial:n          = (#1)
    , inline / reference / sep    .tl_set:N           = \l_@@_inline_ref_sep_tl
    , inline / reference / sep    .value_required:n   = true
    , inline / reference / sep    .initial:n          = 0.5em
    , inline / version / delim    .tl_set:N           = \l_@@_inline_version_delim_tl
    , inline / version / delim    .value_required:n   = true
    , inline / version / delim    .initial:n          = \c_space_tl
    , inline / version / format   .cs_set:Np          = \@@_inline_version_format:n #1
    , inline / version / format   .value_required:n   = true
    , inline / version / format   .initial:n          = #1
    , language                    .tl_set:N           = \l_@@_language_tl
    , language                    .value_required:n   = true
    , language                    .initial:n          =
    , language / variant          .tl_set:N           = \l_@@_language_variant_tl
    , language / variant          .value_required:n   = true
    , language / variant          .initial:n          =
    , leftmargin                  .tl_set:N           = \l_@@_leftmargin_tl
    , leftmargin                  .value_required:n   = true
    , leftmargin                  .initial:n          = \c_zero_dim
    , name / font                 .tl_set:N           = \l_@@_name_font_tl
    , name / font                 .value_required:n   = true
    , name / font                 .initial:n          = \scshape
    , name / format               .cs_set:Np          = \@@_name_format:n #1
    , name / format               .value_required:n   = true
    , name / format               .initial:n          = #1
    , noindent                    .bool_set_inverse:N = \l_@@_indent_bool
    , noindent                    .default:n          = true
    , parindent                   .tl_set:N           = \l_@@_parindent_tl
    , parindent                   .value_required:n   = true
    , parindent                   .initial:n          = \parindent
    , parskip                     .tl_set:N           = \l_@@_parskip_tl
    , parskip                     .value_required:n   = true
    , parskip                     .initial:n          = \parskip
    , pilcrow                     .bool_set:N         = \l_@@_pilcrow_bool
    , pilcrow                     .default:n          = true
    , pilcrow                     .initial:n          = false
    , pilcrow / sep               .tl_set:N           = \l_@@_pilcrow_sep_tl
    , pilcrow / sep               .value_required:n   = true
    , pilcrow / sep               .initial:n          = 0.25em
    , redletter                   .bool_set:N         = \l_@@_red_letter_bool
    , redletter                   .default:n          = true
    , redletter                   .initial:n          = false
    , redletter / colour          .tl_set:N           = \l_@@_red_letter_colour_tl
    , redletter / colour          .value_required:n   = true
    , redletter / colour          .initial:n          = red!80!black
    , redletter / color           .meta:n             = { redletter / colour = { #1 } }
    , reference / align           .choices:nn         = { left, right }
                                                        {
                                                          \tl_if_exist:NF \l_@@_ref_align_tl
                                                            { \tl_new:N \l_@@_ref_align_tl }
                                                          \tl_set_eq:NN \l_@@_ref_align_tl \l_keys_choice_tl
                                                        }
    , reference / align           .value_required:n   = true
    , reference / align           .initial:n          = right
    , reference / colour          .tl_set:N           = \l_@@_ref_colour_tl
    , reference / colour          .value_required:n   = true
    , reference / colour          .initial:n          = .
    , reference / color           .meta:n             = { reference / colour = { #1 } }
    , reference / font            .tl_set:N           = \l_@@_ref_font_tl
    , reference / font            .value_required:n   = true
    , reference / font            .initial:n          = \bfseries
    , reference / format          .cs_set:Np          = \@@_ref_format:n #1
    , reference / format          .value_required:n   = true
    , reference / format          .initial:n          = #1
    , reference / newline         .meta:n             = { reference / sep = \linewidth }
    , reference / newline         .value_forbidden:n  = true
    , reference / position        .choices:nn         = { start, end }
                                                        {
                                                          \tl_if_exist:NF \l_@@_ref_position_tl
                                                            { \tl_new:N \l_@@_ref_position_tl }
                                                          \tl_set_eq:NN \l_@@_ref_position_tl \l_keys_choice_tl
                                                        }
    , reference / position        .value_required:n   = true
    , reference / position        .initial:n          = end
    , reference / sep             .tl_set:N           = \l_@@_ref_sep_tl
    , reference / sep             .value_required:n   = true
    , reference / sep             .initial:n          = 2em
    , reference / start / inline  .bool_set_inverse:N = \l_@@_ref_start_newline_bool
    , reference / start / inline  .default:n          = true
    , reference / start / newline .bool_set:N         = \l_@@_ref_start_newline_bool
    , reference / start / newline .default:n          = true
    , reference / start / newline .initial:n          = false
    , reference / start / sep     .tl_set:N           = \l_@@_ref_start_sep_tl
    , reference / start / sep     .value_required:n   = true
    , reference / start / sep     .initial:n          = 1em
    , reference / start / vsep    .tl_set:N           = \l_@@_ref_vertical_sep_tl
    , reference / start / vsep    .value_required:n   = true
    , reference / start / vsep    .initial:n          = 0pt
    , rightmargin                 .tl_set:N           = \l_@@_rightmargin_tl
    , rightmargin                 .value_required:n   = true
    , rightmargin                 .initial:n          = \c_zero_dim
    , selah / text                .tl_set:N           = \l_@@_selah_text_tl
    , selah / text                .value_required:n   = true
    , selah / text                .initial:n          = Selah
    , selah / font                .tl_set:N           = \l_@@_selah_font_tl
    , selah / font                .value_required:n   = true
    , selah / font                .initial:n          = \itshape
    , selah / format              .cs_set:Np          = \@@_selah_format:n #1
    , selah / format              .value_required:n   = true
    , selah / format              .initial:n          = #1
    , selah / sep                 .tl_set:N           = \l_@@_selah_sep_tl
    , selah / sep                 .value_required:n   = true
    , selah / sep                 .initial:n          = 1em
    , style                       .choice:
    , style / unknown             .code:n             = \msg_error:nnx
                                                          { scripture }
                                                          { unknown-style }
                                                          { \exp_not:n {#1} }
    , textright / sep             .tl_set:N           = \l_@@_text_right_sep_tl
    , textright / sep             .value_required:n   = true
    , textright / sep             .initial:n          = 1em
    , verse                       .int_gset:N         = \g_@@_verse_int
    , verse                       .value_required:n   = true
    , verse                       .initial:n          = \c_one_int
    , verse / colour              .tl_set:N           = \l_@@_verse_colour_tl
    , verse / colour              .value_required:n   = true
    , verse / colour              .initial:n          = .
    , verse / color               .meta:n             = { verse / colour = { #1 } }
    , verse / first               .bool_set:N         = \l_@@_verse_first_bool
    , verse / first               .default:n          = true
    , verse / first               .initial:n          = false
    , verse / firstformat         .cs_set:Np          = \@@_verse_first_format:n #1
    , verse / firstformat         .value_required:n   = true
    , verse / firstformat         .initial:n          = #1
    , verse / firstsep            .tl_set:N           = \l_@@_verse_first_sep_tl
    , verse / firstsep            .value_required:n   = true
    , verse / firstsep            .initial:n          = 0.5em
    , verse / font                .tl_set:N           = \l_@@_verse_font_tl
    , verse / font                .value_required:n   = true
    , verse / font                .initial:n          = 
    , verse / format              .cs_set:Np          = \@@_verse_format:n #1
    , verse / format              .value_required:n   = true
    , verse / format              .initial:n          = \textsuperscript{#1}
    , verse / hide                .bool_set_inverse:N = \l_@@_verse_show_bool
    , verse / hide                .default:n          = true
    , verse / para                .bool_set:N         = \l_@@_verse_para_bool
    , verse / para                .default:n          = true
    , verse / para                .initial:n          = false
    , verse / para / indent       .tl_set:N           = \l_@@_para_indent_tl
    , verse / para / indent       .value_required:n   = true
    , verse / para / indent       .initial:n          = \l_@@_parindent_tl
    , verse / sep                 .tl_set:N           = \l_@@_verse_sep_tl
    , verse / sep                 .value_required:n   = true
    , verse / sep                 .initial:n          = 0.05em
    , verse / show                .bool_set:N         = \l_@@_verse_show_bool
    , verse / show                .default:n          = true
    , verse / show                .initial:n          = true
    , version                     .tl_set:N           = \l_@@_version_tl
    , version                     .value_required:n   = true
    , version                     .initial:n          =
    , version / delim             .tl_set:N           = \l_@@_version_delim_tl
    , version / delim             .value_required:n   = true
    , version / delim             .initial:n          = \c_space_tl
    , version / format            .cs_set:Np          = \@@_version_format:n #1
    , version / format            .value_required:n   = true
    , version / format            .initial:n          = (#1)
    , version / position          .choices:nn         = { withref, end }
                                                        {
                                                          \tl_if_exist:NF \l_@@_version_position_tl
                                                            { \tl_new:N \l_@@_version_position_tl }
                                                          \tl_set_eq:NN \l_@@_version_position_tl \l_keys_choice_tl
                                                        }
    , version / position          .value_required:n   = true
    , version / position          .initial:n          = withref
%    \end{macrocode}
% Options for the \env{center} environment.
%    \begin{macrocode}
    , center / aboveskip          .tl_set:N           = \l_@@_center_aboveskip_tl
    , center / aboveskip          .value_required:n   = true
    , center / aboveskip          .initial:n          = \medskipamount
    , center / belowskip          .tl_set:N           = \l_@@_center_belowskip_tl
    , center / belowskip          .value_required:n   = true
    , center / belowskip          .initial:n          = \medskipamount
    , center / leftmargin         .tl_set:N           = \l_@@_center_leftmargin_tl
    , center / leftmargin         .value_required:n   = true
    , center / leftmargin         .initial:n          = \c_zero_dim
    , center / rightmargin        .tl_set:N           = \l_@@_center_rightmargin_tl
    , center / rightmargin        .value_required:n   = true
    , center / rightmargin        .initial:n          = \c_zero_dim
%    \end{macrocode}
% Options for the \env{flushright} environment.
%    \begin{macrocode}
    , flushright / aboveskip      .tl_set:N           = \l_@@_flushright_aboveskip_tl
    , flushright / aboveskip      .value_required:n   = true
    , flushright / aboveskip      .initial:n          = \medskipamount
    , flushright / belowskip      .tl_set:N           = \l_@@_flushright_belowskip_tl
    , flushright / belowskip      .value_required:n   = true
    , flushright / belowskip      .initial:n          = \medskipamount
    , flushright / leftmargin     .tl_set:N           = \l_@@_flushright_leftmargin_tl
    , flushright / leftmargin     .value_required:n   = true
    , flushright / leftmargin     .initial:n          = \c_zero_dim
    , flushright / rightmargin    .tl_set:N           = \l_@@_flushright_rightmargin_tl
    , flushright / rightmargin    .value_required:n   = true
    , flushright / rightmargin    .initial:n          = \c_zero_dim
%    \end{macrocode}
% Options for the \env{hanging} environment.
%    \begin{macrocode}
    , hanging / aboveskip         .tl_set:N           = \l_@@_hanging_aboveskip_tl
    , hanging / aboveskip         .value_required:n   = true
    , hanging / aboveskip         .initial:n          = \medskipamount
    , hanging / belowskip         .tl_set:N           = \l_@@_hanging_belowskip_tl
    , hanging / belowskip         .value_required:n   = true
    , hanging / belowskip         .initial:n          = \medskipamount
    , hanging / chapter / indent  .bool_set:N         = \l_@@_hanging_chapter_indent_bool
    , hanging / chapter / indent  .default:n          = true
    , hanging / chapter / indent  .initial:n          = true
    , hanging / hang              .tl_set:N           = \l_@@_hanging_hang_tl
    , hanging / hang              .value_required:n   = true
    , hanging / hang              .initial:n          = 2em
    , hanging / leftmargin        .tl_set:N           = \l_@@_hanging_leftmargin_tl
    , hanging / leftmargin        .value_required:n   = true
    , hanging / leftmargin        .initial:n          = 1em
    , hanging / rightmargin       .tl_set:N           = \l_@@_hanging_rightmargin_tl
    , hanging / rightmargin       .value_required:n   = true
    , hanging / rightmargin       .initial:n          = \c_zero_dim
    , hanging / verse / left      .bool_set_inverse:N = \l_@@_hanging_verse_right_bool
    , hanging / verse / left      .default:n          = true
    , hanging / verse / right     .bool_set:N         = \l_@@_hanging_verse_right_bool
    , hanging / verse / right     .default:n          = true
    , hanging / verse / right     .initial:n          = true
    , hanging / verse / sep       .tl_set:N           = \l_@@_hanging_verse_sep_tl
    , hanging / verse / sep       .value_required:n   = true
    , hanging / verse / sep       .initial:n          = 0.05em
%    \end{macrocode}
% Options for the mid-paragraph chapters (including the \env{midparachap} environment).
%    \begin{macrocode}
    , midparachap / hideverse     .bool_set_inverse:N = \l_@@_midparachap_show_verse_bool
    , midparachap / hideverse     .default:n          = true
    , midparachap / showverse     .bool_set:N         = \l_@@_midparachap_show_verse_bool
    , midparachap / showverse     .default:n          = true
    , midparachap / showverse     .initial:n          = true
%    \end{macrocode}
% Options for the \env{narrow} environment.
%    \begin{macrocode}
    , narrow / aboveskip          .tl_set:N           = \l_@@_narrow_aboveskip_tl
    , narrow / aboveskip          .value_required:n   = true
    , narrow / aboveskip          .initial:n          = \medskipamount
    , narrow / belowskip          .tl_set:N           = \l_@@_narrow_belowskip_tl
    , narrow / belowskip          .value_required:n   = true
    , narrow / belowskip          .initial:n          = \medskipamount
    , narrow / leftmargin         .tl_set:N           = \l_@@_narrow_leftmargin_tl
    , narrow / leftmargin         .value_required:n   = true
    , narrow / leftmargin         .initial:n          = 1em
    , narrow / rightmargin        .tl_set:N           = \l_@@_narrow_rightmargin_tl
    , narrow / rightmargin        .value_required:n   = true
    , narrow / rightmargin        .initial:n          = 1em
%    \end{macrocode}
% Options for the \env{poetry} environment.
%    \begin{macrocode}
    , poetry / aboveskip          .tl_set:N           = \l_@@_poetry_aboveskip_tl
    , poetry / aboveskip          .value_required:n   = true
    , poetry / aboveskip          .initial:n          = \medskipamount
    , poetry / belowskip          .tl_set:N           = \l_@@_poetry_belowskip_tl
    , poetry / belowskip          .value_required:n   = true
    , poetry / belowskip          .initial:n          = \medskipamount
    , poetry / bigindent          .tl_set:N           = \l_@@_poetry_big_indent_tl
    , poetry / bigindent          .value_required:n   = true
    , poetry / bigindent          .initial:n          = 4em
    , poetry / indent             .tl_set:N           = \l_@@_poetry_indent_tl
    , poetry / indent             .value_required:n   = true
    , poetry / indent             .initial:n          = 1em
    , poetry / leftmargin         .tl_set:N           = \l_@@_poetry_leftmargin_tl
    , poetry / leftmargin         .value_required:n   = true
    , poetry / leftmargin         .initial:n          = 1em
    , poetry / rightmargin        .tl_set:N           = \l_@@_poetry_rightmargin_tl
    , poetry / rightmargin        .value_required:n   = true
    , poetry / rightmargin        .initial:n          = \c_zero_dim
    , poetry / verse / left       .bool_set_inverse:N = \l_@@_poetry_verse_right_bool
    , poetry / verse / left       .default:n          = true
    , poetry / verse / right      .bool_set:N         = \l_@@_poetry_verse_right_bool
    , poetry / verse / right      .default:n          = true
    , poetry / verse / right      .initial:n          = true
    , poetry / verse / sep        .tl_set:N           = \l_@@_poetry_verse_sep_tl
    , poetry / verse / sep        .value_required:n   = true
    , poetry / verse / sep        .initial:n          = 0.05em
  }
%    \end{macrocode}
% Process package options.
%    \begin{macrocode}
\ProcessKeyOptions
%    \end{macrocode}
%
% Create interface to reset all keys to defaults.
%    \begin{macrocode}
\tl_new:N \l_@@_default_options_tl
\keys_precompile:nnN { scripture }
  {
    , aboveskip                   = \c_zero_skip
    , added / font                =
    , added / format              = \emph { #1 }
    , after                       =
    , before                      =
    , belowskip                   = \c_zero_skip
    , book                        =
    , colour                      = .
    , compact                     = false
    , chapter                     = \c_one_int
    , chapter / align             = left
    , chapter / font              = \bfseries
    , chapter / colour            = .
    , chapter / drop              = true
    , chapter / format            = #1
    , chapter / para              = false
    , chapter / para / aboveskip  = \bigskipamount
    , chapter / para / belowskip  = \medskipamount
    , chapter / para / indent     = true
    , chapter / sep               = 0.5em
    , chapter / show              = true
    , chapter / showverse         = false
    , chapter / smash             = false
    , chapter / valign            = bottom
    , chapter / xchar             = X
    , extraskip                   = \medskipamount
    , font                        =
    , heading / aboveskip         = \bigskipamount
    , heading / afterindent       = false
    , heading / align             = left
    , heading / belowskip         = \medskipamount
    , heading / font              = \small\itshape
    , heading / format            = #1
    , heading / show              = true
    , indent                      = true
    , inline                      = false
    , inline / begin              = ``
    , inline / end                = ''
    , inline / reference / format = (#1)
    , inline / reference / sep    = 0.5em
    , inline / version / delim    = \c_space_tl
    , inline / version / format   = #1
    , language                    =
    , language / variant          =
    , leftmargin                  = \c_zero_dim
    , name / font                 = \scshape
    , name / format               = #1
    , parindent                   = \parindent
    , parskip                     = \parskip
    , pilcrow                     = false
    , pilcrow / sep               = 0.25em
    , redletter                   = false
    , redletter / colour          = red!80!black
    , reference / align           = right
    , reference / colour          = .
    , reference / font            = \bfseries
    , reference / format          = #1
    , reference / position        = end
    , reference / sep             = 2em
    , reference / start / newline = false
    , reference / start / sep     = 1em
    , reference / start / vsep    = 0pt
    , rightmargin                 = \c_zero_dim
    , selah / text                = Selah
    , selah / font                = \itshape
    , selah / format              = #1
    , selah / sep                 = 1em
    , textright / sep             = 1em
    , verse                       = \c_one_int
    , verse / colour              = .
    , verse / first               = false
    , verse / firstformat         = #1
    , verse / firstsep            = 0.5em
    , verse / font                =
    , verse / format              = \textsuperscript{#1}
    , verse / para                = false
    , verse / para / indent       = \l_@@_parindent_tl
    , verse / sep                 = 0.05em
    , verse / show                = true
    , version                     =
    , version / delim             = \c_space_tl
    , version / format            = (#1)
    , version / position          = withref
    , center / aboveskip          = \medskipamount
    , center / belowskip          = \medskipamount
    , center / leftmargin         = \c_zero_dim
    , center / rightmargin        = \c_zero_dim
    , flushright / aboveskip      = \medskipamount
    , flushright / belowskip      = \medskipamount
    , flushright / leftmargin     = \c_zero_dim
    , flushright / rightmargin    = \c_zero_dim
    , hanging / aboveskip         = \medskipamount
    , hanging / belowskip         = \medskipamount
    , hanging / chapter / indent  = true
    , hanging / hang              = 2em
    , hanging / leftmargin        = 1em
    , hanging / rightmargin       = \c_zero_dim
    , hanging / verse / right     = true
    , hanging / verse / sep       = 0.05em
    , midparachap / showverse     = true
    , narrow / aboveskip          = \medskipamount
    , narrow / belowskip          = \medskipamount
    , narrow / leftmargin         = 1em
    , narrow / rightmargin        = 1em
    , poetry / aboveskip          = \medskipamount
    , poetry / belowskip          = \medskipamount
    , poetry / bigindent          = 4em
    , poetry / indent             = 1em
    , poetry / leftmargin         = 1em
    , poetry / rightmargin        = \c_zero_dim
    , poetry / verse / right      = true
    , poetry / verse / sep        = 0.05em
  }
  \l_@@_default_options_tl
\cs_new_protected:Nn \@@_setup_reset_defaults:
  {
    \l_@@_default_options_tl
  }
%    \end{macrocode}
%
% \begin{macro}{\@@_setup_style:nnn}
%   Specify options which can later be activated using the \opt{style} option.
%   If the first argument is \val{true}, then the options are appended rather
%   than replaced.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_setup_style:nnn
  {
    \bool_if:NTF #1
      {
        \tl_if_exist:cF { g__@@_style_ #2 _tl }
          { \tl_new:c { g__@@_style_ #2 _tl } }
        \@@_setup_style:nne \c_false_bool { #2 }
          { \tl_use:c { g__@@_style_ #2 _tl } , #3 }
      }
      {
        \tl_gset:cn { g__@@_style_ #2 _tl } { #3 }
        \keys_define:nn { scripture }
          { style / #2 .meta:n = { #3 } }
      }
  }
\cs_generate_variant:Nn \@@_setup_style:nnn { nne }
%    \end{macrocode}
% \end{macro}
%
% \subsection{Hooks}
%
% \begin{hooks}{scripture/chap/before, scripture/chap/after,
%   scripture/verse/before, scripture/verse/after}
% Hooks for before and after chapters and verses. The current chapter and
% verse is available in the hooks as \fn{scripturecurrentchapter} and
% \fn{scripturecurrentverse} respectively. These are global.
%    \begin{macrocode}
\hook_new_pair:nn { scripture / chap / before } { scripture / chap / after }
\hook_new_pair:nn { scripture / verse / before } { scripture / verse / after }
%    \end{macrocode}
% \end{hooks}
%
% \begin{hooks}{scripture/pilcrow, scripture/poetry/pilcrow}
% These are internal hooks used to insert a pilcrow at the beginning of a
% paragraph. Pilcrows are activated using the \opt{pilcrow} option and are
% only in effect when the \opt{verse/para} and/or \opt{compact} options are in
% use.
%    \begin{macrocode}
\hook_new:n { scripture / pilcrow }
\hook_new:n { scripture / poetry / pilcrow }
%    \end{macrocode}
% \end{hooks}
%
% \subsection{The main \env{scripture} environment}
%
% \begin{macro}{\l_@@_active_bool, \l_@@_active_inner_bool}
%   Flags to ensure that environments are not nested.
%    \begin{macrocode}
\bool_new:N \l_@@_active_bool
\bool_new:N \l_@@_active_inner_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_first_verse_set_bool}
%   Set to \val{true} when the first \cs{ch} or \cs{vs} has been set. This is
%   used to ensure automatic chapter and verse numbering starts at the right
%   place.
%    \begin{macrocode}
\bool_new:N \g_@@_first_verse_set_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_mode_vertical_inner_bool}
%   Whether an inner environment is starting in vertical mode. This flag is
%   only used with the \opt{compact} and \opt{verse/para} options.
%    \begin{macrocode}
\bool_new:N \g_@@_mode_vertical_inner_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_clubpenalty_saved_int}
%   Holds saved club penalty so we can change and restore it around chapter
%   breaks.
%    \begin{macrocode}
\int_new:N \l_@@_clubpenalty_saved_int
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_prev_inner_below_skip}
%   Save the last below skip of an inner environment so it can be removed if
%   the main scripture environment ends with and inner environment.
%    \begin{macrocode}
\skip_new:N \g_@@_prev_inner_below_skip
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_outer_itemindent_dim}
%   Holds the \cs{itemindent} of the outer list. Used to calculate the
%   \cs{itemindent} to retain correct indenting when a list environment is
%   the first thing in an outer list.
%    \begin{macrocode}
\dim_new:N \l_@@_outer_itemindent_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_setup_list_noindent:n}
%   Set \cs{noindent} to do a negative horizontal skip a list is the first
%   item in a list then restore it at the end of the paragraph. This allows
%   \cs{itemindent} to be set to a negative value and still have \cs{noindent}
%   behave as expected.
%    \begin{macrocode}
\cs_new_protected_nopar:Nn \@@_setup_list_noindent:n
  {
    \legacy_if:nT { @newlist }
      {
        \cs_set_protected_nopar:Npn \noindent
          {
            \skip_horizontal:n { -#1 }
            \bool_if:NT \l_@@_verse_para_bool
              {
                \peek_analysis_map_inline:n
                  {
                    \bool_lazy_or:nnTF
                      { \exp_args:No \token_if_eq_meaning_p:NN { ####1 } \vs }
                      { \exp_args:No \token_if_eq_meaning_p:NN { ####1 } \newvs }
                      {
                        \bool_gset_true:N \g_@@_suppress_next_verse_para_bool
                        \@@_set_pilcrow_hook:
                      }
                      {
                        \str_if_eq:VnF \l_@@_currenvir_str { poetry }
                          { \@@_pilcrow_output: }
                      }
                    \peek_analysis_map_break:n { ####1 }
                  }
              }
          }
        \hook_gput_next_code:nn { para / end }
          {
            \bool_if:NTF \l_@@_verse_para_bool
              {
                \str_if_eq:VnTF \l_@@_currenvir_str { poetry }
                  { \cs_set_eq:NN \noindent \tex_noindent:D }
                  { \cs_set_eq:NN \noindent \@@_para_noindent: }
              }
              { \cs_set_eq:NN \noindent \tex_noindent:D }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_skip_diff:NN}
%   Find the difference between two skips while avoiding negative stretch and
%   shrink components.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_skip_diff:NN
  {
    \skip_eval:n
      {
        \dim_eval:n { \dimexpr #1 - \dimexpr #2 }
        ~ plus ~
          \dim_max:nn { \gluestretch #1 - \gluestretch #2 } \c_zero_dim
        ~ minus ~
          \dim_max:nn { \glueshrink #1 - \glueshrink #2 } \c_zero_dim
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_extra_skip:}
%   Insert a little extra vertical space between two paragraphs. This function
%   tests if the previous paragraph is only one line in length and began
%   with a \fn{ch} function. If this condition is met, more space is added
%   if necessary to avoid the following paragraph clashing with the drop
%   chapter.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_extra_skip:
  {
    \mode_if_vertical:F
      {
        \bool_if:NTF \l_@@_verse_para_bool
          { \para_end: }
          { \par }
      }
    \int_compare:nNnT
      \g_@@_chap_par_prevgraf_int = 1
      {
        \dim_compare:nNnT
          { \parskip + \glueexpr \l_@@_extraskip_tl } < \baselineskip
          {
            \addvspace { \baselineskip }
          }
        \int_gzero:N \g_@@_chap_par_prevgraf_int
      }
    \addvspace { \l_@@_extraskip_tl }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_text_right:nn}
%   Align a word to the right and finish a paragraph, pushing to the next line
%   if there is not space for the word.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_text_right:nn
  {
    \bool_lazy_or:nnTF
      { \str_if_eq_p:Vn \l_@@_currenvir_str { flushright } }
      { \str_if_eq_p:Vn \l_@@_currenvir_str { center } }
      {
        \unskip
        \break
        \strut
        \hfill
        #2
        \para_end:
      }
      {
        {
          \unskip
          \hfil
          \penalty 50
          \skip_horizontal:n { #1 }
          \hbox:n {}
          \nobreak
          \hfill
          #2
          \skip_zero:N \parfillskip
          \int_zero:N \finalhyphendemerits
          \para_end:
        }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{Formatting and printing quotation references}
%
% \begin{macro}{\l_@@_ref_box}
%   Box to hold the formatted reference.
%    \begin{macrocode}
\box_new:N \l_@@_ref_box
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_format_full_ref:nn}
%   Format a scripture quotation with its reference.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_format_full_ref:nn
  {
    \group_begin:
    \l_@@_ref_font_tl
    \str_if_eq:VnF \l_@@_ref_colour_tl { . }
      { \exp_args:NV \color_select:n \l_@@_ref_colour_tl }
    \@@_ref_format:n
      {
        #1
%    \end{macrocode}
% Append a Bible version if it has been specified.
%    \begin{macrocode}
        \tl_if_empty:oF { #2 }
          {
            \tl_if_empty:oF { #1 }
              { \l_@@_version_delim_tl }
            \@@_version_format:n { #2 }
          }
      }
    \group_end:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_reference:n}
%   Output the reference for the Scripture quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_reference:n
  {
    \hbox_set:Nn \l_@@_ref_box
      {
        \@@_format_full_ref:nn { #1 } \l_@@_version_tl
      }
    \dim_compare:nNnT
      { \box_wd:N \l_@@_ref_box + \g_@@_final_line_dim + \l_@@_ref_sep_tl }
      >
      \linewidth
      {
        \skip_vertical:N \baselineskip
        \tl_if_eq:NnT \l_@@_ref_align_tl { left }
          {
            \int_compare:nNnT \g_@@_chap_par_prevgraf_int = 1
              { \skip_vertical:N \baselineskip }
          }
      }
    \tl_if_eq:NnTF \l_@@_ref_align_tl { right }
      { \hfill }
      {
        \dim_compare:nNnT
          { \box_wd:N \l_@@_ref_box + \g_@@_final_line_dim + \l_@@_ref_sep_tl }
          <
          \linewidth
          { \skip_horizontal:n { \g_@@_final_line_dim + \l_@@_ref_sep_tl } }
      }
    \box_use:N \l_@@_ref_box
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_reference_start_inline:}
%   Output the reference for the Scripture quotation when inline at the start.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_reference_start_inline:
  {
    \tl_if_empty:NF \l_@@_ref_tl
      {
        \tl_if_eq:NnTF \l_@@_version_position_tl { withref }
          { \@@_format_full_ref:nn { \l_@@_ref_tl } { \l_@@_version_tl } }
          { \@@_format_full_ref:nn { \l_@@_ref_tl } { } }
        \skip_horizontal:N \l_@@_ref_start_sep_tl
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_reference_start_newline:}
%   Output the reference for the Scripture quotation when on a new line at the
%   start.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_reference_start_newline:
  {
    \tl_if_empty:NF \l_@@_ref_tl
      {
        \bool_gset_eq:NN \g_tmpa_bool \g_@@_suppress_next_pilcrow_bool
        \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool
        \noindent
        \bool_gset_eq:NN \g_@@_suppress_next_pilcrow_bool \g_tmpa_bool
        \str_if_eq:VnF \l_@@_currenvir_str { scripture }
          { \skip_horizontal:n { -\leftmargin } }
        \tl_if_eq:NnTF \l_@@_version_position_tl { withref }
          { \@@_format_full_ref:nn { \l_@@_ref_tl } { \l_@@_version_tl } }
          { \@@_format_full_ref:nn { \l_@@_ref_tl } { } }
        \bool_lazy_or:nnT
          { \str_if_eq_p:Vn \l_@@_currenvir_str { flushright } }
          { \str_if_eq_p:Vn \l_@@_currenvir_str { center } }
          {
            \hfill
            \strut
          }
        \bool_if:NTF \l_@@_compact_bool
          { \para_end: }
          {
            \bool_lazy_all:nTF
              {
                { \l_@@_verse_para_bool }
                { \bool_not_p:n { \str_if_eq_p:Vn \l_@@_currenvir_str { hanging } } }
                { \bool_not_p:n { \str_if_eq_p:Vn \l_@@_currenvir_str { poetry } } }
              }
              { \para_end: }
              { \par }
          }
        \nobreak
        \@afterheading
        \addvspace { \l_@@_ref_vertical_sep_tl }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_reference_start_peek:}
%   Peek ahead at the beginning of the \env{scripture} environment to control
%   how references are inserted at the start of a quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_reference_start_peek:
  {
    \peek_remove_spaces:n
      {
        \bool_lazy_and:nnTF
          { \str_if_eq_p:Vn \l_@@_ref_position_tl { start } }
          { \bool_not_p:n { \tl_if_empty_p:N \l_@@_ref_tl } }
          {
            \bool_lazy_or:nnF
              { \str_if_eq_p:Vn \l_@@_currenvir_str { scripture } }
              { \str_if_eq_p:Vn \l_@@_currenvir_str { midparachap } }
              {
                \bool_if:NF \l_@@_compact_bool
                  { \bool_set_true:N \l_@@_ref_start_newline_bool }
              }
            \peek_analysis_map_inline:n
              {
                \bool_case:nF
                  {
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \heading }
                      { \@@_reference_start_newline: }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \noindent }
                      {
                        \bool_if:NTF \l_@@_ref_start_newline_bool
                          { \@@_reference_start_newline: }
                          { \@@_reference_start_inline: }
                      }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \nohang }
                      {
                        \bool_if:NTF \l_@@_ref_start_newline_bool
                          { \@@_reference_start_newline: }
                          { \@@_reference_start_inline: }
                      }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \nopilcrow }
                      {
                        \bool_if:NTF \l_@@_ref_start_newline_bool
                          { \@@_reference_start_newline: }
                          { \@@_reference_start_inline: }
                        \peek_analysis_map_break:n
                          {
                            ##1
                            \@@_fix_protrusion:n { }
                          }
                      }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \begin }
                      {
                        \bool_if:NF \l_@@_indent_bool
                          {
                            \hook_gput_next_code:nn { para / begin }
                              {
                                \bool_lazy_or:nnT
                                  { \str_if_eq_p:Vn \l_@@_currenvir_str { midparachap } }
                                  { \str_if_eq_p:Vn \l_@@_currenvir_str { scripture } }
                                  { \para_omit_indent: }
                              }
                          }
                      }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \ch }
                      {
                        \bool_if:NTF \l_@@_ref_start_newline_bool
                          { \@@_reference_start_newline: }
                          {
                            \cs_set_eq:NN \@@_temp_ch \ch
                            \RenewDocumentCommand \ch { s o m }
                              {
                                \tl_if_novalue:nF { ##2 }
                                  {
                                    \tl_set:Nn \l_@@_X_char_tl { ##2 }
                                  }
                                \cs_set_eq:NN \ch \@@_temp_ch
                              }
                            \@@_reference_start_inline:
                          }
                      }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \newch }
                      {
                        \bool_if:NTF \l_@@_ref_start_newline_bool
                          { \@@_reference_start_newline: }
                          {
                            \cs_set_eq:NN \@@_temp_newch \newch
                            \RenewDocumentCommand \newch { s o }
                              {
                                \tl_if_novalue:nF { ##2 }
                                  {
                                    \tl_set:Nn \l_@@_X_char_tl { ##2 }
                                  }
                                \cs_set_eq:NN \newch \@@_temp_newch
                              }
                            \@@_reference_start_inline:
                          }
                      }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \vs }
                      {
                        \bool_if:NTF \l_@@_ref_start_newline_bool
                          { \@@_reference_start_newline: }
                          {
                            \cs_set_eq:NN \@@_temp_vs \vs
                            \RenewDocumentCommand \vs { m }
                              { \cs_set_eq:NN \vs \@@_temp_vs }
                            \@@_reference_start_inline:
                          }
                      }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \newvs }
                      {
                        \bool_if:NTF \l_@@_ref_start_newline_bool
                          { \@@_reference_start_newline: }
                          {
                            \cs_set_eq:NN \@@_temp_newvs \newvs
                            \RenewDocumentCommand \newvs { }
                              { \cs_set_eq:NN \newvs \@@_temp_newvs }
                            \@@_reference_start_inline:
                          }
                      }
                  }
                  {
                    \bool_if:NTF \l_@@_ref_start_newline_bool
                      {
                        \@@_reference_start_newline:
                        \bool_if:NTF \l_@@_compact_bool
                          {
                            \bool_if:NT \g_@@_mode_vertical_inner_bool
                              { \@@_pilcrow_output: }
                          }
                          {
                            \str_if_eq:VnF \l_@@_currenvir_str { poetry }
                            { \@@_pilcrow_output: }
                          }
                      }
                      { \@@_reference_start_inline: }
                  }
                \exp_args:No \token_if_eq_meaning:NNF { ##1 } \begin
                  {
                    \tl_clear:N \l_@@_ref_tl
                    \tl_if_eq:NnF \l_@@_version_position_tl { end }
                      { \tl_clear:N \l_@@_version_tl }
                  }
                \peek_analysis_map_break:n
                  { \@@_fix_protrusion:o { ##1 } }
              }
          }
          {
            \peek_analysis_map_inline:n
              {
                \bool_case:nF
                  {
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \heading }
                      { }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \noindent }
                      { }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \nohang }
                      { }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \nopilcrow }
                      {
                        \peek_analysis_map_break:n
                          {
                            ##1
                            \@@_fix_protrusion:n { }
                          }
                      }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \begin }
                      {
                        \bool_if:NF \l_@@_indent_bool
                          {
                            \hook_gput_next_code:nn { para / begin }
                              {
                                \bool_lazy_or:nnT
                                  { \str_if_eq_p:Vn \l_@@_currenvir_str { midparachap } }
                                  { \str_if_eq_p:Vn \l_@@_currenvir_str { scripture } }
                                  { \para_omit_indent: }
                              }
                          }
                      }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \ch }
                      { }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \newch }
                      { }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \vs }
                      {
                        \mode_if_vertical:F
                          { \@@_set_pilcrow_hook: }
                      }
                    { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \newvs }
                      {
                        \mode_if_vertical:F
                          { \@@_set_pilcrow_hook: }
                      }
                  }
                  {
                    \bool_if:NTF \l_@@_compact_bool
                      {
                        \bool_if:NT \g_@@_mode_vertical_inner_bool
                          { \@@_pilcrow_output: }
                      }
                      {
                        \str_if_eq:VnF \l_@@_currenvir_str { poetry }
                        { \@@_pilcrow_output: }
                      }
                  }
                \peek_analysis_map_break:n
                  {
                    \@@_fix_protrusion:o { ##1 }
                  }
              }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_compact_par:}
%   \cs{par} macro used when the \opt{compact} option is in use.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_compact_par:
  {
    \bool_gset_false:N \g_@@_mode_vertical_inner_bool
    \dim_set:Nn \parindent { \l_@@_parindent_tl }
    \peek_remove_spaces:n
      {
        \peek_analysis_map_inline:n
          {
            \bool_case:n
              {
                { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \begin }
                  { \bool_gset_true:N \g_@@_mode_vertical_inner_bool }
                { \str_if_eq_p:Vn \l_@@_currenvir_str { poetry } }
                  { }
                { \exp_args:No \token_if_letter_p:N { ##1 } }
                  { \@@_pilcrow_output: }
                { \exp_args:No \token_if_active_p:N { ##1 } }
                  { \@@_pilcrow_output: }
                { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \vs }
                  { \@@_set_pilcrow_hook: }
                { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \newvs }
                  { \@@_set_pilcrow_hook: }
              }
            \peek_analysis_map_break:n { ##1 }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_para_noindent:}
%   \cs{noindent} macro used when the \opt{verse/para} option is in use.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_para_noindent:
  {
    \legacy_if:nTF { @newlist }
      {
        \tex_noindent:D
        \peek_analysis_map_inline:n
          {
            \bool_lazy_or:nnTF
              { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \vs }
              { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \newvs }
              { \bool_gset_true:N \g_@@_suppress_next_verse_para_bool }
              { \@@_pilcrow_output: }
            \peek_analysis_map_break:n { ##1 }
          }
      }
      {
        \peek_analysis_map_inline:n
          {
            \bool_lazy_or:nnTF
              { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \vs }
              { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \newvs }
              {
                \bool_if:NT \l_@@_verse_para_bool
                  { \para_end: }
                \tex_noindent:D
                \bool_gset_true:N \g_@@_suppress_next_verse_para_bool
                \@@_set_pilcrow_hook:
              }
              { \@@_pilcrow_output: }
            \peek_analysis_map_break:n { ##1 }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_para_mode_vertical_bool}
%   Flag that \cs{@@_para_par:} has been encountered and pilcrow not yet
%   printed.
%    \begin{macrocode}
\bool_new:N \g_@@_para_mode_vertical_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_post_env_indent_box}
%   Box to store the indent after an inner environment in the case where it is
%   dropped by \cs{@@_dopeend:}. This box is then inserted if the next thing
%   is a \fn{vs}. Only used when the \opt{verse/para} option is active.
%    \begin{macrocode}
\box_new:N \g_@@_post_env_indent_box
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_para_par:}
%   \cs{par} macro used when the \opt{verse/para} option is in use.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_para_par:
  {
    \bool_gset_true:N \g_@@_para_mode_vertical_bool
    \dim_set:Nn \parindent { \l_@@_parindent_tl }
    \peek_remove_spaces:n
      {
        \peek_analysis_map_inline:n
          {
            \bool_case:n
              {
                { \exp_args:No \token_if_letter_p:N { ##1 } }
                  { \@@_pilcrow_output: }
                { \exp_args:No \token_if_active_p:N { ##1 } }
                  { \@@_pilcrow_output: }
                { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \vs }
                  { \@@_set_pilcrow_hook: }
                { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \newvs }
                  { \@@_set_pilcrow_hook: }
              }
            \peek_analysis_map_break:n { ##1 }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_doendpe:}
%   Custom version of \cs{@doendpe} macro used when the \opt{verse/para}
%   option is in use. This handles pilcrows after inner environments.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_doendpe:
  {
    \box_gclear:N \g_@@_post_env_indent_box
    \legacy_if_set_true:n { @endpe }
    \cs_set_nopar:Npn \par
      {
        \@restorepar
        \clubpenalty \@clubpenalty
        \everypar { }
        \par
        \legacy_if_set_false:n { @endpe }
        \bool_gset_false:N \g_@@_suppress_next_pilcrow_bool
        \@@_para_par:
      }
    \everypar
      {
        \box_gset_to_last:N \g_@@_post_env_indent_box
        \hook_gput_next_code:nn { para / after }
          { \box_gclear:N \g_@@_post_env_indent_box }
        \everypar { }
        \legacy_if_set_false:n { @endpe }
        \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool
        \bool_if:NT \l_@@_verse_para_bool
          {
            \box_set_wd:Nn
              \g_@@_post_env_indent_box
              { \l_@@_para_indent_tl }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_fix_protrusion:n, \@@_fix_protrusion:o}
%   The use of \cs{peek} macros breaks protrusion at the beginning of list
%   environments. This function checks conditions and add \cs{leftprotrusion}.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_fix_protrusion:n
  {
    \bool_if:NTF \l_@@_compact_bool
      {
        \str_if_eq:VnT \l_@@_currenvir_str { scripture }
          { \cs_if_exist_use:N \leftprotrusion }
      }
      { \cs_if_exist_use:N \leftprotrusion }
    #1
  }
\cs_generate_variant:Nn \@@_fix_protrusion:n { o }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{Red lettering}
%
% \begin{macro}{\g_@@_red_letter_active_bool}
%   Flag indicating if currently in a red letter block of text.
%    \begin{macrocode}
\bool_new:N \g_@@_red_letter_active_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_red_letter_on:}
%   Mark the beginning of a section of text attributed to Jesus Christ.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_red_letter_on:
  {
    \bool_if:NT \l_@@_red_letter_bool
      {
        \bool_gset_true:N \g_@@_red_letter_active_bool
        \exp_args:NV \color_select:n \l_@@_red_letter_colour_tl
        \str_if_eq:VnF \l_@@_currenvir_str { scripture }
          {
            \hook_gput_next_code:nn { env / \l_@@_currenvir_str / after }
              {
                \exp_args:NV \color_select:n \l_@@_red_letter_colour_tl
              }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_red_letter_off:}
%   Mark the beginning of a section of text attributed to Jesus Christ.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_red_letter_off:
  {
    \bool_if:NT \l_@@_red_letter_bool
      {
        \color_select:n { scripture default colour }
        \bool_gset_false:N \g_@@_red_letter_active_bool
        \str_if_eq:VnF \l_@@_currenvir_str { scripture }
          {
            \hook_gput_next_code:nn { env / \l_@@_currenvir_str / after }
              {
                \color_select:n { scripture default colour }
              }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{Selecting language}
%
% \begin{macro}{\@@_select_language:}
%   Select specified language if required.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_select_language:
  {
    \tl_if_empty:NF \l_@@_language_tl
      {
        \@ifpackageloaded { babel }
          {
            \@@_set_textdirection:
            \selectlanguage { \l_@@_language_tl }
          }
          {
            \@ifpackageloaded { polyglossia }
              {
                \iflanguageloaded { \l_@@_language_tl }
                  {
                    \tl_if_empty:NTF \l_@@_language_variant_tl
                      {
                        \selectlanguage { \l_@@_language_tl }
                      }
                      {
                        \selectlanguage
                          [ variant = \l_@@_language_variant_tl ]
                          { \l_@@_language_tl }
                      }
                  }
                  {
                    \msg_error:nnx
                      { scripture }
                      { language-error }
                      { \l_@@_language_tl }
                  }
              }
              {
                \msg_warning:nnx
                  { scripture }
                  { language-warning }
                  { \l_@@_language_tl }
              }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{Formatting and printing chapter numbers}
%
% \begin{macro}{\l_@@_chap_box, l_@@_chap_tmp_box}
%   Boxes use to store and calculate drop chapter.
%    \begin{macrocode}
\box_new:N \l_@@_chap_box
\box_new:N \l_@@_chap_tmp_box
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_chap_fontsize_dim}
%   Calculated font size of a drop chapter number.
%    \begin{macrocode}
\dim_new:N \l_@@_chap_fontsize_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_chap_height_dim}
%   Calculated height of a drop chapter number.
%    \begin{macrocode}
\dim_new:N \l_@@_chap_height_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_chap_width_dim}
%   Calculated width of drop chapter number.
%    \begin{macrocode}
\dim_new:N \g_@@_chap_width_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_chap_par_prevgraf_int}
%   Store the number of lines a chapter paragraph takes up.
%    \begin{macrocode}
\int_new:N \g_@@_chap_par_prevgraf_int
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_chap_X_height_dim}
%   Calculated height of X at current font size. This is used as the height
%   for a drop chapter.
%    \begin{macrocode}
\dim_new:N \l_@@_chap_X_height_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_para_chap_indent_dim}
%   Indent used to center chapters when placed in their own paragraph.
%    \begin{macrocode}
\dim_new:N \l_@@_para_chap_indent_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_nodrop_chap_coffin}
%   Coffin to place non-drop chapters inside.
%    \begin{macrocode}
\coffin_new:N \l_@@_nodrop_chap_coffin
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_nodrop_chap_voffset_dim}
%   Vertical offset to use when setting non-drop chapters.
%    \begin{macrocode}
\dim_new:N \l_@@_nodrop_chap_voffset_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_get_X_height:}
%   Calculate the height of \cs{l_@@_X_char_tl} for vertical alignment of
%   non-drop chapters.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_get_X_height:
  {
    \hbox_set:Nn \l_@@_chap_tmp_box { \l_@@_X_char_tl }
    \dim_set:Nn \l_@@_chap_X_height_dim
      { \box_ht:N \l_@@_chap_tmp_box }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_drop_chap_set_up:n}
%   Set up chapter drop cap and calculate its various dimensions.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_drop_chap_set_up:n
  {
    \cs_gset_nopar:Npn \scripturecurrentchapter { #1 }
    \cs_gset_nopar:Npn \scripturecurrentverse { 1 }
    \@@_get_X_height:
    \dim_set:Nn \l_@@_chap_height_dim
      { \baselineskip + \l_@@_chap_X_height_dim }
    \dim_set:Nn \l_@@_chap_fontsize_dim
      {
        \f@size pt *
        \dim_ratio:nn
          { \l_@@_chap_height_dim }
          { \l_@@_chap_X_height_dim }
      }
    \hbox_set:Nn \l_@@_chap_tmp_box
      {
        \l_@@_chap_font_tl
        \fontsize
          { \l_@@_chap_fontsize_dim }
          { \l_@@_chap_fontsize_dim }
          \selectfont
        \str_if_eq:VnF \l_@@_chapter_colour_tl { . }
          { \exp_args:NV \color_select:n \l_@@_chapter_colour_tl }
        \@@_chap_format:n { #1 }
      }
    \dim_gset:Nn \g_@@_chap_width_dim
      { \box_wd:N \l_@@_chap_tmp_box }
%    \end{macrocode}
%   Avoid breaks in the middle of drop chapters.
%    \begin{macrocode}
    \int_set_eq:NN \l_@@_clubpenalty_saved_int \clubpenalty
    \clubpenalty 10000
    \bool_if:NF \l_@@_verse_para_bool
    {
      \str_if_eq:VnTF \l_@@_currenvir_str { poetry }
        { \int_gset_eq:NN \g_@@_current_group_level_b_int \currentgrouplevel }
        {
          \int_gset:Nn \g_@@_current_group_level_b_int { \currentgrouplevel + 1 }
        }
      \@@_chap_par_save_prevgraf_at_group_level:
    }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_drop_chap_output:}
%   Output a drop chapter.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_drop_chap_output:
  {
    \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool
    \cs_if_eq:NNTF \noindent \@@_para_noindent:
      {
        \legacy_if:nTF { @newlist }
          {
            \skip_horizontal:n { -\l_@@_parindent_tl }
          }
          { \tex_noindent:D }
        \@@_pilcrow_output:
      }
      { \noindent }
    \parshape 3 ~
      \dim_eval:n
        { \@totalleftmargin + \g_@@_chap_width_dim + \l_@@_chap_sep_tl } ~
      \dim_eval:n
        { \linewidth - \g_@@_chap_width_dim - \l_@@_chap_sep_tl } ~
      \dim_eval:n
        { \@totalleftmargin + \g_@@_chap_width_dim + \l_@@_chap_sep_tl } ~
      \dim_eval:n
        { \linewidth - \g_@@_chap_width_dim - \l_@@_chap_sep_tl } ~
      \@totalleftmargin ~
      \linewidth
    \group_begin:
    \hook_use:n { scripture / chap / before }
    \box_use:N \l_@@_chap_box
    \hook_use:n { scripture / chap / after }
    \group_end:
    \bool_if:NT \l_@@_chap_show_verse_bool
      { \@@_verse_output:n { 1 } }
    \bool_if:NT \l_@@_verse_para_bool
    {
      \int_gset_eq:NN \g_@@_current_group_level_b_int \currentgrouplevel
      \@@_chap_par_save_prevgraf_at_group_level:
    }
    \hook_gclear_next_code:n { scripture / pilcrow }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_nodrop_chap:n}
%   Format a non-drop chapter.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_nodrop_chap:n
  {
    \cs_gset_nopar:Npn \scripturecurrentchapter { #1 }
    \cs_gset_nopar:Npn \scripturecurrentverse { 1 }
    \group_begin:
    \bool_if:NT \l_@@_verse_para_bool
      {
        \legacy_if:nF { @newlist }
          { \mode_if_vertical:F \para_end: }
      }
    \bool_if:NTF \l_@@_chap_show_bool
      {
        \@@_get_X_height:
        \hcoffin_set:Nn \l_@@_nodrop_chap_coffin
          {
            \str_if_eq:VnF \l_@@_chapter_colour_tl { . }
              { \exp_args:NV \color_select:n \l_@@_chapter_colour_tl }
            \l_@@_chap_font_tl
            \@@_chap_format:n { #1 }
            \kern \l_@@_chap_sep_tl
          }
        \dim_zero:N \l_@@_nodrop_chap_voffset_dim
        \tl_if_eq:NnT \l_@@_chapter_valign_tl { t }
          { \dim_set_eq:NN \l_@@_nodrop_chap_voffset_dim \l_@@_chap_X_height_dim }
        \tl_if_eq:NnT \l_@@_chapter_valign_tl { vc }
          { \dim_set:Nn \l_@@_nodrop_chap_voffset_dim { 0.5 \l_@@_chap_X_height_dim } }
        \hook_use:n { scripture / chap / before }
        \bool_if:NTF \l_@@_chap_smash_bool
          {
            \mode_leave_vertical:
            \smash
              {
                \exp_args:NNoo
                  \coffin_typeset:Nnnnn \l_@@_nodrop_chap_coffin
                    { \l_@@_chapter_align_tl }
                    { \l_@@_chapter_valign_tl }
                    { 0pt }
                    { \l_@@_nodrop_chap_voffset_dim }
              }
          }
          {
            \exp_args:NNoo
              \coffin_typeset:Nnnnn \l_@@_nodrop_chap_coffin
                { \l_@@_chapter_align_tl }
                { \l_@@_chapter_valign_tl }
                { 0pt }
                { \l_@@_nodrop_chap_voffset_dim }
          }
        \nobreak
        \skip_horizontal:N \c_zero_skip
        \hook_use:n { scripture / chap / after }
        \bool_if:NT \l_@@_chap_show_verse_bool
          {
            \@@_verse_output:n { 1 }
          }
        \str_if_eq:VnF \l_@@_currenvir_str { midparachap }
          { \@@_pilcrow_output: }
      }
      {
        \hook_use:n { scripture / chap / before }
        \hook_use:n { scripture / chap / after }
        \vs { 1 }
      }
    \group_end:
    \parshape 1 ~ \@totalleftmargin ~ \linewidth
    \hook_gclear_next_code:n { scripture / pilcrow }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_para_chap:n}
%   Format a chapter in its own paragraph.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_para_chap:n
  {
    \cs_gset_nopar:Npn \scripturecurrentchapter { #1 }
    \cs_gset_nopar:Npn \scripturecurrentverse { 1 }
    \group_begin:
    \skip_zero:N \parskip
    \bool_if:NTF \l_@@_chap_show_bool
      {
        \dim_set_eq:NN \l_@@_para_chap_indent_dim \linewidth
        \str_if_eq:VnTF \l_@@_currenvir_str { scripture }
          {
            \dim_set:Nn \l_@@_para_chap_indent_dim { 0.5 \l_@@_para_chap_indent_dim }
          }
          {
            \dim_add:Nn \l_@@_para_chap_indent_dim { \leftmargin + \rightmargin }
            \dim_set:Nn \l_@@_para_chap_indent_dim { 0.5 \l_@@_para_chap_indent_dim }
            \dim_sub:Nn \l_@@_para_chap_indent_dim \leftmargin
          }
        \mode_if_vertical:F \para_end:
        \addvspace { \l_@@_chap_para_aboveskip_tl }
        \bool_gset_eq:NN \g_tmpa_bool \g_@@_suppress_next_pilcrow_bool
        \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool
        \str_if_eq:VnTF \l_@@_currenvir_str { midparachap }
          { \tex_noindent:D }
          { \noindent }
        \bool_gset_eq:NN \g_@@_suppress_next_pilcrow_bool \g_tmpa_bool
        \skip_horizontal:N \l_@@_para_chap_indent_dim
        \hbox_overlap_center:n
          {
            \hook_use:n { scripture / chap / before }
            \group_begin:
            \str_if_eq:VnF \l_@@_chapter_colour_tl { . }
              { \exp_args:NV \color_select:n \l_@@_chapter_colour_tl }
            \l_@@_chap_font_tl
            \@@_chap_format:n { #1 }
            \group_end:
            \hook_use:n { scripture / chap / after }
          }
        \para_end:
        \nobreak
        \bool_lazy_any:nTF
          {
            { \str_if_eq_p:Vn \l_@@_currenvir_str { scripture } }
            { \str_if_eq_p:Vn \l_@@_currenvir_str { midparachap } }
            { \str_if_eq_p:Vn \l_@@_currenvir_str { narrow } }
          }
          { \legacy_if_set:nn { @afterindent } { \l_@@_chap_para_afterindent_bool } }
          { \legacy_if_set_true:n { @afterindent } }
        \@afterheading
      }
      {
        \hook_use:n { scripture / chap / before }
        \hook_use:n { scripture / chap / after }
      }
    \peek_meaning:NTF \c_space_token
      {
        \addvspace { \l_@@_chap_para_belowskip_tl }
        \group_end:
        \hook_use:n { scripture / poetry / pilcrow }
      }
      {
        \addvspace { \l_@@_chap_para_belowskip_tl }
        \cs_if_eq:NNTF \vs \@@_poetry_mode_vertical_verse:n
          {
            \bool_gset_eq:NN \g_tmpa_bool \g_@@_suppress_next_pilcrow_bool
            \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool
            \noindent
            \vs { 1 }
            \bool_gset_eq:NN \g_@@_suppress_next_pilcrow_bool \g_tmpa_bool
          }
          {
            \str_if_eq:VnT \l_@@_currenvir_str { midparachap }
              { \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool }
            \vs { 1 }
          }
        \group_end:
        \hook_use:n { scripture / poetry / pilcrow }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_chap:n}
%   Position a drop chapter.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_chap:n
  {
    \@@_drop_chap_set_up:n { #1 }
    \hbox_set:Nn \l_@@_chap_box
      {
        \box_move_down:nn
          { \baselineskip }
          { 
            \hbox_overlap_left:n
              {
                \box_use:N \l_@@_chap_tmp_box
                \skip_horizontal:N \l_@@_chap_sep_tl
              }
          }
      }
    \box_set_ht:Nn \l_@@_chap_box { \c_zero_dim }
    \box_set_dp:Nn \l_@@_chap_box { \c_zero_dim }
    \bool_if:NTF \l_@@_mid_para_chap_bool
      { \@@_mid_para_drop_chap_output: }
      {
        \bool_if:NTF \l_@@_verse_para_bool
          { \para_end: }
          { \par }
        \@@_drop_chap_output:
        \str_if_eq:VnF \l_@@_currenvir_str { midparachap }
          { \@@_pilcrow_output: }
      }
    \int_gset_eq:NN \g_@@_current_group_level_a_int \currentgrouplevel
    \@@_reset_par_at_group_level:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_current_group_level_a_int,
%     \g_@@_current_group_level_a_int, \g_@@_current_group_level_c_int}
%   Track the group level so indent and spacing is correctly reset after a
%   drop chapter even if the first paragraph of the chapter contains something
%   like a \cs{footnote}.
%    \begin{macrocode}
\int_new:N \g_@@_current_group_level_a_int
\int_new:N \g_@@_current_group_level_b_int
\int_new:N \g_@@_current_group_level_c_int
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_reset_par_at_group_level:}
%   This function skips over inner groups (like \cs{footnote}) before
%   resetting the \cs{parshape} after a drop chapter.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_reset_par_at_group_level:
  {
    \hook_gput_next_code:nn { para / before }
      {
        \int_compare:nNnTF
          { \g_@@_current_group_level_a_int } = { \currentgrouplevel }
          {
            \legacy_if:nF { @newlist }
              {
                \int_compare:nNnT \g_@@_chap_par_prevgraf_int = 1
                  {
                    \dim_compare:nNnT \parskip < \baselineskip
                      {
                        \dim_compare:nNnT
                          { \g_@@_chap_width_dim + \l_@@_chap_sep_tl } > \parindent
                          {
                            \hook_gput_next_code:nn { para / begin }
                              {
                                \para_omit_indent:
                                \skip_horizontal:n {\g_@@_chap_width_dim + \l_@@_chap_sep_tl }
                              }
                          }
                      }
                  }
                \int_gzero:N \g_@@_chap_par_prevgraf_int
              }
            \parshape 1 ~ \@totalleftmargin ~ \linewidth
          }
          { \@@_reset_par_at_group_level: }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_chap_par_save_prevgraf_at_group_level:}
%   This function skips over inner groups (like \cs{footnote}) before
%   saving the \cs{prevgraf}.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_chap_par_save_prevgraf_at_group_level:
  {
    \hook_gput_next_code:nn { para / after }
      {
        \int_compare:nNnTF
          { \g_@@_current_group_level_b_int } = { \currentgrouplevel }
          {
            \int_gset_eq:NN \g_@@_chap_par_prevgraf_int \prevgraf
            \int_compare:nNnT \g_@@_chap_par_prevgraf_int = 1
              { \penalty 10000 }
            \hook_gput_next_code:nn { para / before }
              { \int_set_eq:NN \clubpenalty \l_@@_clubpenalty_saved_int }
          }
          { \@@_chap_par_save_prevgraf_at_group_level: }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_zero_chap_par_prevgraf_at_group_level:}
%   This function skips over inner groups (like \cs{footnote}) before
%   zeroing \cs{g_@@_chap_par_prevgraf_int}.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_zero_chap_par_prevgraf_at_group_level:
  {
    \hook_gput_next_code:nn { para / after }
      {
        \int_compare:nNnTF
          { \g_@@_current_group_level_c_int } = { \currentgrouplevel }
          {
            \hook_gput_next_code:nn { para / after }
              { \int_gzero:N \g_@@_chap_par_prevgraf_int }
          }
          { \@@_zero_chap_par_prevgraf_at_group_level: }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{Formatting and printing verse numbers}
%
% \begin{macro}{\l_@@_verse_par_start_bool}
%   Flag for whether the current verse is at the start of a paragraph.
%    \begin{macrocode}
\bool_new:N \l_@@_verse_par_start_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_no_verse_first_bool}
%   Suppress the next verse from formatting differently if it begins a new
%   paragraph.
%    \begin{macrocode}
\bool_new:N \l_@@_no_verse_first_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_suppress_next_verse_para_bool}
%   Suppress the next verse from starting a new paragraph when
%   \opt{verse/para} is in use.
%    \begin{macrocode}
\bool_new:N \g_@@_suppress_next_verse_para_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_verse_output:n}
%   Output a formatted verse.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_verse_output:n
  {
    \cs_gset_nopar:Npn \scripturecurrentverse { #1 }
    \legacy_if:nTF { @endpe }
      { \bool_set_false:N \l_@@_verse_par_start_bool }
      { \bool_set_true:N \l_@@_verse_par_start_bool }
    \mode_if_vertical:TF
      { \mode_leave_vertical: }
      { \bool_set_false:N \l_@@_verse_par_start_bool }
    \bool_if:NT \l_@@_no_verse_first_bool
      {
        \bool_set_false:N \l_@@_verse_par_start_bool
        \bool_set_false:N \l_@@_no_verse_first_bool
      }
    \group_begin:
    \bool_if:NT \l_@@_verse_para_bool
      {
        \box_if_empty:NF \g_@@_post_env_indent_box
          { \box_use_drop:N \g_@@_post_env_indent_box }
      }
    \hook_use:n { scripture / verse / before }
    \bool_if:NT \l_@@_verse_show_bool
      {
        \group_begin:
        \l_@@_verse_font_tl
        \str_if_eq:VnF \l_@@_verse_colour_tl { . }
          { \exp_args:NV \color_select:n \l_@@_verse_colour_tl }
        \bool_lazy_all:nTF
          {
            { \l_@@_verse_first_bool }
            { \l_@@_verse_par_start_bool }
            { \bool_not_p:n { \str_if_eq_p:Vn \l_@@_currenvir_str { poetry } } }
          }
          {
            \@@_verse_first_format:n { #1 }
            \group_end:
            \kern \l_@@_verse_first_sep_tl
          }
          {
            \@@_verse_format:n { #1 }
            \group_end:
            \kern \l_@@_verse_sep_tl
          }
        \nobreak
        \skip_horizontal:N \c_zero_skip
      }
    \hook_use:n { scripture / verse / after }
    \hook_use:n { scripture / pilcrow }
    \group_end:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_verse_compact_output:n}
%   Output a formatted verse.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_verse_compact_output:n
  {
    \mode_if_vertical:T
      { \@@_set_pilcrow_hook: }
    \@@_verse_output:n { #1 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_verse_para_output:n}
%   Output a formatted verse when \opt{verse/para} is set.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_verse_para_output:n
  {
    \mode_if_vertical:T
      { \@@_set_pilcrow_hook: }
    \hook_if_empty:nT { scripture / pilcrow }
      { \dim_set:Nn \parindent \l_@@_para_indent_tl }
    \bool_if:NTF \g_@@_suppress_next_verse_para_bool
      { \bool_gset_false:N \g_@@_suppress_next_verse_para_bool }
      {
        \legacy_if:nF { @newlist }
          {
            \mode_if_vertical:F
              {
                \para_end:
                \parshape 1 ~ \@totalleftmargin ~ \linewidth
              }
          }
      }
    \@@_verse_output:n { #1 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_hanging_verse_para:n}
%   Output a formatted verse when \opt{verse/para} is set and in a hanging
%   environment.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_hanging_verse_para:n
  {
    \mode_if_vertical:T
      { \@@_set_pilcrow_hook: }
    \bool_if:NF \g_@@_suppress_next_verse_para_bool
      {
        \legacy_if:nF { @newlist }
          {
            \mode_if_vertical:F
              {
                \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool
                \hook_gput_next_code:nn { para / begin }
                  { \parshape 1 ~ \@totalleftmargin ~ \linewidth }
                \par
                \tex_noindent:D
              }
          }
      }
    \bool_gset_false:N \g_@@_suppress_next_verse_para_bool
    \@@_hanging_verse:n { #1 }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{Printing pilcrows}
%
% \begin{macro}{\g_@@_suppress_next_pilcrow_bool}
%   Flag to suppress the next pilcrow.
%    \begin{macrocode}
\bool_new:N \g_@@_suppress_next_pilcrow_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_set_pilcrow_hook:}
%   Set the next \hook{scripture/pilcrow} hook to output a pilcrow providing
%   the hook is currently empty.
%   \opt{verse/para} or \opt{compact} options are set.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_set_pilcrow_hook:
  {
    \hook_if_empty:nT { scripture / pilcrow }
      {
        \hook_gput_next_code:nn { scripture / pilcrow } { \@@_pilcrow_output: }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_pilcrow_output:}
%   Output a pilcrow (\P). Pilrows only display when either the
%   \opt{verse/para} or \opt{compact} options are set.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_pilcrow_output:
  {
    \bool_gset_false:N \g_@@_para_mode_vertical_bool
    \bool_gset_false:N \g_@@_mode_vertical_inner_bool
    \bool_if:NT \l_@@_pilcrow_bool
      {
        \bool_lazy_or:nnT \l_@@_verse_para_bool \l_@@_compact_bool
          {
            \bool_if:NTF \g_@@_suppress_next_pilcrow_bool
              { \bool_gset_false:N \g_@@_suppress_next_pilcrow_bool }
              {
                \P
                \kern \l_@@_pilcrow_sep_tl
                \nobreak
                \skip_horizontal:N \c_zero_skip
              }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{Calculating the length of the final line in a paragraph}
%
% \begin{macro}{\g_@@_final_line_dim}
%   Store the length of the final line in a paragraph.
%    \begin{macrocode}
\dim_new:N \g_@@_final_line_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_calc_final_line_length:}
%   Calculate the length of the final line in a paragraph.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_calc_final_line_length:
  {
    \skip_set:Nn \abovedisplayshortskip { -\baselineskip }
    \skip_set_eq:NN \abovedisplayskip \abovedisplayshortskip
    \skip_zero:N \belowdisplayshortskip
    \skip_zero:N \belowdisplayskip
    $$
      \hook_use:n { para / after }
      \dim_compare:nNnTF \predisplaysize > \c_zero_dim
        {
          \dim_gset:Nn \g_@@_final_line_dim
            { \predisplaysize - 2em }
        }
        {
          \bool_if:NT \l_@@_textdir_change_in_group_bool
            {
              \str_if_eq:VnT \l_@@_currenvir_str { scripture }
                { \int_set:Nn \prevgraf { \int_use:N \prevgraf - 1 } }
            }
        }
      \cs_gset_nopar:Nx \@@_reset_spacing:
        {
          \dim_set:Nn \predisplaysize { \dim_use:N \predisplaysize }
          \int_set:Nn \prevgraf { \int_use:N \prevgraf }
          \int_gset:Nn \g_@@_chap_par_prevgraf_int { \int_use:N \g_@@_chap_par_prevgraf_int }
        }
    $$
    \@@_reset_spacing:
    \dim_compare:nNnT \g_@@_final_line_dim > \paperwidth
      { \dim_gset:Nn \g_@@_final_line_dim { \@totalleftmargin + \linewidth } }
    \dim_compare:nNnT \g_@@_final_line_dim > { \c_zero_dim - 1sp }
      { \skip_vertical:n { -\baselineskip - \parskip } }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{The \env{scripture} environment}
%
% \begin{macro}{\l_@@_currenvir_str}
%   Store the current \env{scripture} environment.
%    \begin{macrocode}
\str_new:N \l_@@_currenvir_str
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_parskip_correction_skip}
%   Correction to ensure consistent \cs{parskip} at start of \env{scripture}
%   environment with non-zero \opt{parskip} option.
%    \begin{macrocode}
\skip_new:N \l_@@_parskip_correction_skip
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_ref_tl}
%   Store the reference passed to the \env{scripture} environment.
%    \begin{macrocode}
\tl_new:N \l_@@_ref_tl
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_added:n}
%   Mark text as added.
%    \begin{macrocode}
\cs_new_protected_nopar:Nn \@@_added:n
  {
    \group_begin:
    \l_@@_added_font_tl
    \@@_added_format:n { #1 }
    \group_end:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_heading:n}
%   Output a non-canonical heading.
%    \begin{macrocode}
\cs_new_protected_nopar:Nn \@@_heading:n
  {
    \str_if_eq:VnTF \l_@@_currenvir_str { scripture }
      {
        \bool_if:NTF \l_@@_heading_show_bool
          {
            \parshape 1 ~ \@totalleftmargin ~ \linewidth
            \group_begin:
            \bool_set_false:N \l_@@_pilcrow_bool
            \legacy_if:nTF { @newlist }
              {
                \skip_horizontal:n { -\parindent }
              }
              {
                \@@_list_para_end:
                \addvspace { \l_@@_heading_aboveskip_tl }
                \tex_noindent:D
              }
            \l_@@_heading_align_tl
            \l_@@_heading_font_tl
            \@@_heading_format:n { #1 }
            \@@_list_para_end:
            \group_end:
            \bool_if:NTF \l_@@_verse_para_bool
              {
                \cs_set_eq:NN \noindent \_@@_para_noindent:
              }
              {
                \cs_set_eq:NN \noindent \tex_noindent:D
              }
            \legacy_if_set:nn { @afterindent } \l_@@_heading_afterindent_bool
            \bool_if:NF \l_@@_heading_afterindent_bool
              {
                \hook_gput_next_code:nn { para / before }
                  { \para_omit_indent: }
              }
            \nobreak
            \@afterheading
            \addvspace { \l_@@_heading_belowskip_tl }
          }
          { \ignorespaces }
      }
      {
        \msg_error:nnx { scripture } { heading-error } { \l_@@_currenvir_str }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_name:n}
%   Output divine name.
%    \begin{macrocode}
\cs_new_protected_nopar:Nn \@@_name:n
  {
    \group_begin:
    \l_@@_name_font_tl
    \@@_name_format:n { #1 }
    \group_end:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_no_first_verse:}
%   Suppress special formatting for first verse if active.
%    \begin{macrocode}
\cs_new_protected_nopar:Nn \@@_no_first_verse:
  {
    \bool_set_true:N \l_@@_no_verse_first_bool
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ch_output:nn}
%   Print a chapter number in the main scripture environment.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_ch_output:nn
  {
    \bool_if:NTF \l_@@_chap_show_bool
      {
        \bool_if:NTF \l_@@_chap_drop_bool
          {
            \@@_chap:n { #2 }
            \bool_lazy_and:nnTF
            { #1 }
            { \bool_not_p:n { \l_@@_compact_bool } }
            {
              \hook_gput_next_code:nn { para / after }
                {
                  \int_gzero:N \g_@@_chap_par_prevgraf_int
                  \int_gzero:N \g_@@_mid_para_chap_prevgraf_int
                }
            }
            {
              \hook_gput_next_code:nn { para / after }
                { \int_gset_eq:NN \g_@@_mid_para_chap_prevgraf_int \prevgraf }
            }
          }
          {
            \bool_if:NTF \l_@@_chap_para_bool
              { \@@_para_chap:n { #2 } }
              { \@@_nodrop_chap:n { #2 } }
          }
      }
      {
        \bool_if:NTF \l_@@_chap_para_bool
          { \@@_para_chap:n { #2 } }
          { \@@_nodrop_chap:n { #2 } }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_begin:nn}
%   Begin a scripture quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_begin:nn
  {
    \cs_set_eq:NN \@@_noindent_saved: \noindent
    \bool_if:NT \l_@@_active_bool
      {
        \msg_error:nn { scripture } { nested-environment }
      }
    \bool_set_true:N \l_@@_active_bool
    \tl_if_novalue:nF { #1 }
      { \tl_set:Nn \l_@@_ref_tl { #1 } }
    \str_set:Nn \l_@@_currenvir_str { scripture }
    \bool_gset_false:N \g_@@_first_verse_set_bool
    \int_gset:Nn \g_@@_chapter_int \c_one_int
    \int_gset:Nn \g_@@_verse_int \c_one_int
    \tl_gclear:N \g_@@_book_tl
    \tl_if_novalue:nF { #2 }
      {
        \keys_set:nn { scripture } { #2 }
      }
    \l_@@_before_tl
    \@@_select_language:
    \int_gzero:N \g_@@_chap_par_prevgraf_int
%    \end{macrocode}
% Empty \cs{everydisplay} to ensure it isn't interring with spacing.
%    \begin{macrocode}
    \everydisplay { }
    \int_set:Nn \predisplaypenalty { 10000 }
    \int_set_eq:NN \postdisplaypenalty \@lowpenalty
    \int_set:Nn \@beginparpenalty { -\@lowpenalty }
    \int_set_eq:NN \@endparpenalty \@lowpenalty
    \bool_gset_false:N \g_@@_poetry_end_bool
    \cs_set_eq:NN \extraskip \@@_extra_skip:
    \cs_set_eq:NN \redletteron \@@_red_letter_on:
    \cs_set_eq:NN \redletteroff \@@_red_letter_off:
    \cs_set:Npn \nopilcrow { \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool }
    \bool_gset_false:N \g_@@_suppress_next_pilcrow_bool
    \bool_gset_false:N \g_@@_suppress_next_verse_para_bool
    \bool_gset_false:N \g_@@_mode_vertical_inner_bool
    \box_gclear:N \g_@@_post_env_indent_box
    \skip_gzero:N \g_@@_prev_inner_below_skip
    \bool_if:NT \l_@@_chap_para_bool
      { \bool_set_false:N \l_@@_chap_drop_bool }
    \DeclareDocumentCommand { \ch } { s o m }
      {
        \tl_if_novalue:nF { ##2 }
          {
            \tl_set:Nn \l_@@_X_char_tl { ##2 }
          }
        \@@_ch_output:nn { ##1 } { ##3 }
      }
    \cs_set_eq:NN \vs \@@_verse_output:n
    \DeclareDocumentCommand { \newch } { s o }
      {
        \bool_if:NTF \g_@@_first_verse_set_bool
          {
            \int_gincr:N \g_@@_chapter_int
            \int_gset:Nn \g_@@_verse_int \c_one_int
          }
          { \bool_gset_true:N \g_@@_first_verse_set_bool }
        \bool_if:nTF { ##1 }
          {
            \ch* [ ##2 ] { \int_use:N \g_@@_chapter_int }
          }
          {
            \ch [ ##2 ] { \int_use:N \g_@@_chapter_int }
          }
      }
    \DeclareDocumentCommand { \newvs } { }
      {
        \bool_if:NTF \g_@@_first_verse_set_bool
          { \int_gincr:N \g_@@_verse_int }
          { \bool_gset_true:N \g_@@_first_verse_set_bool }
        \vs { \int_use:N \g_@@_verse_int }
      }
    \cs_set_eq:NN \added \@@_added:n
    \cs_set_eq:NN \heading \@@_heading:n
    \cs_set_eq:NN \name \@@_name:n
    \cs_set_protected_nopar:Npn \LORD { \name { Lord } }
    \cs_set_protected_nopar:Npn \GOD { \name { God } }
    \cs_set_eq:NN \nofirstverse \@@_no_first_verse:
    \cs_set_protected_nopar:Npn \textright ##1
      { \@@_text_right:nn { \l_@@_text_right_sep_tl } { ##1 } }
    \hook_gclear_next_code:n { para / before }
    \hook_gclear_next_code:n { scripture / pilcow }
    \hook_gclear_next_code:n { scripture / poetry / pilcow }
    \hook_gput_code:nnn { cmd / @makefntext / before } { scripture }
      { \cs_set_eq:NN \noindent \tex_noindent:D }
    \l_@@_font_tl
    \tl_set:Ne \l_@@_parindent_tl { \dim_eval:n { \l_@@_parindent_tl } }
    \exp_args:NnV \color_set:nn { scripture default colour } \l_@@_colour_tl
    \str_if_eq:VnF \l_@@_colour_tl { . }
      { \color_select:n { scripture default colour } }
    \bool_if:NTF \l_@@_inline_bool
      { \l_@@_inline_begin_tl }
      {
        \legacy_if:nTF { @newlist }
          { \dim_set_eq:NN \l_@@_outer_itemindent_dim \itemindent }
          { \dim_zero:N \l_@@_outer_itemindent_dim }
        \list { }
          {
            \dim_set_eq:NN \leftmargin \l_@@_leftmargin_tl
            \dim_set_eq:NN \rightmargin \l_@@_rightmargin_tl
            \dim_set:Nn \itemindent { \l_@@_parindent_tl - \l_@@_outer_itemindent_dim }
            \dim_set_eq:NN \listparindent \l_@@_parindent_tl
            \skip_zero:N \partopsep
            \skip_set_eq:NN \parsep \l_@@_parskip_tl
            \dim_compare:nNnTF \parskip > \l_@@_aboveskip_tl
              { \skip_zero:N \topsep }
              { \skip_set:Nn \topsep { \@@_skip_diff:NN \l_@@_aboveskip_tl \parskip } }
            \@@_setup_list_noindent:n { \l_@@_parindent_tl }
            \bool_if:NF \l_@@_indent_bool
              {
                \hook_gput_next_code:nn { para / begin }
                  {
                    \bool_if:NTF \l_@@_compact_bool
                      { \para_omit_indent: }
                      {
                        \bool_lazy_any:nT
                          {
                            { \str_if_eq_p:Vn \l_@@_currenvir_str { midparachap } }
                            { \str_if_eq_p:Vn \l_@@_currenvir_str { narrow } }
                            { \str_if_eq_p:Vn \l_@@_currenvir_str { scripture } }
                          }
                          {
                            \legacy_if:nTF { @noparlist }
                              {
                                \bool_lazy_and:nnF
                                  { \str_if_eq_p:Vn \l_@@_currenvir_str { narrow } }
                                  { \str_if_eq_p:Vn \l_@@_ref_position_tl { start } }
                                  { \noindent }
                              }
                              { \para_omit_indent: }
                          }
                      }
                  }
              }
          }
        \cs_set_eq:NN \@@_list_para_end: \@par
        \item
        \relax
    }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_end:}
%   End a scripture quotation with a reference.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_end:
  {
    \tl_if_eq:NnT \l_@@_ref_position_tl { start }
      {
        \tl_clear:N \l_@@_ref_tl
        \tl_if_eq:NnT \l_@@_version_position_tl { withref }
          { \tl_clear:N \l_@@_version_tl }
      }
    \cs_set_eq:NN \noindent \tex_noindent:D
    \bool_if:NTF \l_@@_inline_bool
      {
        \unskip
        \@@_red_letter_off:
        \l_@@_inline_end_tl
        \bool_lazy_or:nnTF
          { \tl_if_novalue_p:n \l_@@_ref_tl }
          { \tl_if_empty_p:N \l_@@_ref_tl }
          {
            \tl_if_empty:NF \l_@@_version_tl
              {
                \skip_horizontal:N \l_@@_ref_sep_tl
                \@@_format_full_ref:nn { } \l_@@_version_tl
              }
          }
          {
            \skip_horizontal:N \l_@@_ref_sep_tl
            \@@_format_full_ref:nn \l_@@_ref_tl \l_@@_version_tl
          }
      }
      {
        \@@_red_letter_off:
        \skip_zero:N \parskip
        \int_set:Nn \postdisplaypenalty { 10000 }
        \@@_calc_final_line_length:
        \dim_gsub:Nn \g_@@_final_line_dim \@totalleftmargin
        \dim_compare:nNnTF \@outerparskip > \l_@@_belowskip_tl
          { \skip_zero:N \@topsepadd }
          { \skip_set:Nn \@topsepadd { \@@_skip_diff:NN \l_@@_belowskip_tl \@outerparskip } }
%    \end{macrocode}
% If a \env{scripture} quotation ends with an inner environment, remove the
% below skip of the inner environment. Also correct for \cs{textdir} quirk.
%    \begin{macrocode}
        \int_compare:nNnT \prevgraf = \c_zero_int
          {
            \bool_if:NT \l_@@_textdir_change_in_group_bool
              { \skip_vertical:n { -\baselineskip } }
            \skip_vertical:n { -\g_@@_prev_inner_below_skip }
          }
        \hook_gclear_next_code:n { para / before }
        \hook_gclear_next_code:n { para / after }
        \noindent
        \bool_lazy_or:nnTF
          { \tl_if_novalue_p:n \l_@@_ref_tl }
          { \tl_if_empty_p:N \l_@@_ref_tl }
          { 
            \tl_if_empty:NTF \l_@@_version_tl
              { \hbox:n { } }
              { \@@_reference:n { } }
          }
          { \@@_reference:n \l_@@_ref_tl }
        \parshape 1 ~ \@totalleftmargin ~ \linewidth
%    \end{macrocode}
% Set \val{@noparlist} to \val{false} to ensure \cs{topsep} is always added
% \env{scripture} environment
%    \begin{macrocode}
        \legacy_if_set_false:n { @noparlist }
        \endlist
      }
    \hook_gremove_code:nn { cmd / @makefntext / before } { scripture }
    \cs_set_eq:NN \noindent \@@_noindent_saved:
    \l_@@_after_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{Scripture internal environments}
%
% \begin{macro}{\@@_compact_end_inner:}
%   End a compact inner environment
%    \begin{macrocode}
\cs_new_protected:Nn \@@_compact_end_inner:
  {
    \hook_gclear_next_code:n { para / before }
    \hook_gclear_next_code:n { para / begin }
    \bool_gset_false:N \g_@@_mode_vertical_inner_bool
    \str_if_eq:VnT \l_@@_ref_position_tl { start }
      {
        \tl_gclear:N \l_@@_ref_tl
      }
    \bool_lazy_and:nnT \l_@@_verse_para_bool \l_@@_chap_drop_bool
      {
        \cs_set_eq:NN \par \para_end:
        \@@_calc_final_line_length:
        \int_gset_eq:NN \g_@@_mid_para_chap_prevgraf_int \g_@@_chap_par_prevgraf_int
        \tex_noindent:D
        \bool_lazy_and:nnTF
          { \bool_if_p:N \l_@@_compact_bool }
          { \int_compare_p:nNn \g_@@_mid_para_chap_prevgraf_int = 1 }
          {
            \hook_gput_next_code:nn { env / \l_@@_currenvir_str / after }
              {
                \parshape 3 ~
                  \@totalleftmargin ~ \linewidth ~
                  \dim_eval:n
                    { \@totalleftmargin + \g_@@_chap_width_dim + \l_@@_chap_sep_tl } ~
                  \dim_eval:n
                    { \linewidth - \g_@@_chap_width_dim - \l_@@_chap_sep_tl } ~
                  \@totalleftmargin ~ \linewidth
              }
            \hbox_to_wd:nn { \g_@@_final_line_dim - \g_@@_chap_width_dim - \l_@@_chap_sep_tl } { }
          }
          {
            \hbox_to_wd:nn \g_@@_final_line_dim { }
          }
        \c_space_token
        \kern 0pt
        \cs_set_eq:NN \par \relax
        \int_gset:Nn \g_@@_current_group_level_a_int { \currentgrouplevel - 1 }
        \@@_reset_par_at_group_level:
      }
    \unskip
  }
%    \end{macrocode}
% \end{macro}
%
%
%
% \subsubsection{The \env{center} environment}
%
% \begin{macro}{\@@_center_begin:n}
%   Begin a centred section in a scripture quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_center_begin:n
  {
    \bool_if:NT \l_@@_active_inner_bool
      {
        \msg_error:nn { scripture } { nested-environment }
      }
    \bool_set_true:N \l_@@_active_inner_bool
    \str_set:Nn \l_@@_currenvir_str { center }
    \tl_if_novalue:nF { #1 }
      {
        \keys_set:nn
          { scripture / center }
          { #1 }
      }
    \legacy_if:nTF { @newlist }
      { \dim_add:Nn \l_@@_outer_itemindent_dim \itemindent }
      { \dim_zero:N \l_@@_outer_itemindent_dim }
    \cs_set_eq:NN \par \para_end:
    \int_gset_eq:NN \g_@@_current_group_level_b_int \currentgrouplevel
    \list { }
      {
        \bool_lazy_or:nnF
          { \mode_if_vertical_p: }
          { \g_@@_para_mode_vertical_bool }
          { \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool }
        \dim_zero:N \labelsep
        \dim_set_eq:NN \leftmargin \l_@@_center_leftmargin_tl
        \dim_set_eq:NN \rightmargin \l_@@_center_rightmargin_tl
        \dim_set:Nn \itemindent { -\l_@@_outer_itemindent_dim }
        \dim_zero:N \listparindent
        \skip_set_eq:NN \parsep \parskip
        \skip_zero:N \partopsep
        \dim_compare:nNnTF \parskip > \l_@@_center_aboveskip_tl
          { \skip_zero:N \topsep }
          { \skip_set:Nn \topsep { \@@_skip_diff:NN \l_@@_center_aboveskip_tl \parskip } }
        \@@_setup_list_noindent:n { \c_zero_dim }
      }
    \int_compare:nNnT \g_@@_chap_par_prevgraf_int = 1
      { \addvspace { \baselineskip } }
    \int_gzero:N \g_@@_chap_par_prevgraf_int
    \centering
    \bool_if:NT \l_@@_verse_para_bool
      {
        \cs_set_eq:NN \par \@@_para_par:
        \cs_set_protected:Npn \\
          {
            \mode_if_horizontal:TF
              { \unskip }
              { \@nolnerr }
          }
      }
    \item
    \relax
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_center_end:}
%   End a centred section in a scripture quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_center_end:
  {
    \cs_set_eq:NN \par \para_end:
    \dim_gset:Nn \g_@@_final_line_dim { \@totalleftmargin + \linewidth }
    \dim_compare:nNnTF \@outerparskip > \l_@@_center_belowskip_tl
      { \skip_zero:N \@topsepadd }
      { \skip_set:Nn \@topsepadd { \@@_skip_diff:NN \l_@@_center_belowskip_tl \@outerparskip } }
    \skip_gset_eq:NN \g_@@_prev_inner_below_skip \@topsepadd
    \legacy_if_set_false:n { @noparlist }
    \endlist
    \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool
    \hook_gput_next_code:nn { para / begin }
      { \parshape 1 ~ \@totalleftmargin ~ \linewidth }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{The \env{flushright} environment}
%
% \begin{macro}{\@@_flushright_begin:n}
%   Begin a flushright section in a scripture quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_flushright_begin:n
  {
    \bool_if:NT \l_@@_active_inner_bool
      {
        \msg_error:nn { scripture } { nested-environment }
      }
    \bool_set_true:N \l_@@_active_inner_bool
    \str_set:Nn \l_@@_currenvir_str { flushright }
    \tl_if_novalue:nF { #1 }
      {
        \keys_set:nn
          { scripture / flushright }
          { #1 }
      }
    \legacy_if:nTF { @newlist }
      { \dim_add:Nn \l_@@_outer_itemindent_dim \itemindent }
      { \dim_zero:N \l_@@_outer_itemindent_dim }
    \cs_set_eq:NN \par \para_end:
    \int_gset_eq:NN \g_@@_current_group_level_b_int \currentgrouplevel
    \list { }
      {
        \bool_lazy_or:nnF
          { \mode_if_vertical_p: }
          { \g_@@_para_mode_vertical_bool }
          { \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool }
        \dim_zero:N \labelsep
        \dim_set_eq:NN \leftmargin \l_@@_flushright_leftmargin_tl
        \dim_set_eq:NN \rightmargin \l_@@_flushright_rightmargin_tl
        \dim_set:Nn \itemindent { -\l_@@_outer_itemindent_dim }
        \dim_zero:N \listparindent
        \skip_set_eq:NN \parsep \parskip
        \skip_zero:N \partopsep
        \dim_compare:nNnTF \parskip > \l_@@_flushright_aboveskip_tl
          { \skip_zero:N \topsep }
          { \skip_set:Nn \topsep { \@@_skip_diff:NN \l_@@_flushright_aboveskip_tl \parskip } }
        \@@_setup_list_noindent:n { \c_zero_dim }
      }
    \int_compare:nNnT \g_@@_chap_par_prevgraf_int = 1
      { \addvspace { \baselineskip } }
    \int_gzero:N \g_@@_chap_par_prevgraf_int
    \raggedleft
    \bool_if:NT \l_@@_verse_para_bool
      {
        \cs_set_eq:NN \par \@@_para_par:
        \cs_set_protected:Npn \\
          {
            \mode_if_horizontal:TF
              { \unskip }
              { \@nolnerr }
          }
      }
    \item
    \relax
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_flushright_end:}
%   End a flushright section in a scripture quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_flushright_end:
  {
    \cs_set_eq:NN \par \para_end:
    \dim_gset:Nn \g_@@_final_line_dim { \@totalleftmargin + \linewidth }
    \dim_compare:nNnTF \@outerparskip > \l_@@_flushright_belowskip_tl
      { \skip_zero:N \@topsepadd }
      { \skip_set:Nn \@topsepadd { \@@_skip_diff:NN \l_@@_flushright_belowskip_tl \@outerparskip } }
    \skip_gset_eq:NN \g_@@_prev_inner_below_skip \@topsepadd
    \legacy_if_set_false:n { @noparlist }
    \endlist
    \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool
    \hook_gput_next_code:nn { para / begin }
      { \parshape 1 ~ \@totalleftmargin ~ \linewidth }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{The \env{hanging} environment}
%
% \begin{macro}{\l_@@_hanging_parindent_saved_dim}
%   Save the \cs{parindent} for later use in \env{hanging} environment.
%    \begin{macrocode}
\dim_new:N \l_@@_hanging_parindent_saved_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_hanging_chap_sep_dim}
%   Calculated chapter separation used in the \env{hanging} environment.
%    \begin{macrocode}
\dim_new:N \l_@@_hanging_chap_sep_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_hanging_ch:n}
%   Position a chapter in a \env{hanging} environment.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_hanging_ch:n
  {
    \bool_gset_false:N \g_@@_suppress_next_pilcrow_bool
    \bool_if:NTF \l_@@_chap_show_bool
      {
        \bool_if:NTF \l_@@_chap_drop_bool
          { \@@_hanging_chap:n { #1 } }
          {
            \bool_if:NTF \l_@@_chap_para_bool
              { \@@_para_chap:n { #1 } }
              { \@@_nodrop_chap:n { #1 } }
          }
      }
      {
        \bool_if:NTF \l_@@_chap_para_bool
          { \@@_para_chap:n { #1 } }
          { \@@_nodrop_chap:n { #1 } }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_hanging_chap:n}
%   Position a drop chapter in a \env{hanging} environment.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_hanging_chap:n
  {
    \dim_set_eq:NN \l_@@_hanging_chap_sep_dim \l_@@_chap_sep_tl
    \@@_drop_chap_set_up:n { #1 }
    \dim_compare:nNnTF
      { \g_@@_chap_width_dim + \l_@@_hanging_chap_sep_dim } < \leftmargin
      {
        \bool_if:NT \l_@@_hanging_chapter_indent_bool
          {
            \dim_set:Nn \l_@@_hanging_chap_sep_dim
              { \leftmargin - \g_@@_chap_width_dim }
          }
      }
      {
        \parshape 3 ~
          \dim_eval:n
            {
              \@totalleftmargin - \leftmargin + \g_@@_chap_width_dim +
              \l_@@_hanging_chap_sep_dim
            } ~
          \dim_eval:n
            {
              \linewidth + \leftmargin - \g_@@_chap_width_dim -
              \l_@@_hanging_chap_sep_dim
            } ~
          \dim_eval:n
            {
              \@totalleftmargin - \leftmargin + \g_@@_chap_width_dim +
              \l_@@_hanging_chap_sep_dim
            } ~
          \dim_eval:n
            {
              \linewidth + \leftmargin - \g_@@_chap_width_dim -
              \l_@@_hanging_chap_sep_dim
            } ~
          \@totalleftmargin ~ \linewidth
      }
    \par
    \bool_if:NTF \l_@@_hanging_chapter_indent_bool
      {
        \dim_set:Nn \l_@@_hanging_chap_sep_dim
          { \l_@@_hanging_chap_sep_dim + \l_@@_hanging_parindent_saved_dim }
        \@@_nohang:
      }
      {
        \mode_leave_vertical:
        \dim_compare:nNnTF
          { \g_@@_chap_width_dim + \l_@@_hanging_chap_sep_dim } > \l_@@_hanging_leftmargin_tl
          {
            \dim_compare:nNnTF
              { \g_@@_chap_width_dim + \l_@@_hanging_chap_sep_dim } > \leftmargin
              {
                \skip_horizontal:n { \l_@@_hanging_hang_tl }
              }
              {
                \skip_horizontal:n
                  {
                    \l_@@_hanging_chap_sep_dim +
                    \g_@@_chap_width_dim -
                    \l_@@_hanging_leftmargin_tl
                  }
              }
          }
          {
            \dim_set:Nn \l_@@_hanging_chap_sep_dim
              { \l_@@_hanging_leftmargin_tl - \g_@@_chap_width_dim }
          }
      }
    \hbox_set:Nn \l_@@_chap_box
      {
        \box_move_down:nn
          { \baselineskip }
          { 
            \hbox_overlap_left:n
              {
                \box_use:N \l_@@_chap_tmp_box
                \skip_horizontal:N \l_@@_hanging_chap_sep_dim
              }
          }
      }
    \box_set_ht:Nn \l_@@_chap_box { \c_zero_dim }
    \box_set_dp:Nn \l_@@_chap_box { \c_zero_dim }
    \group_begin:
    \hook_use:n { scripture / chap / before }
    \box_use:N \l_@@_chap_box
    \hook_use:n { scripture / chap / after }
    \group_end:
    \bool_if:NT \l_@@_chap_show_verse_bool
      {
        \@@_verse_output:n { 1 }
      }
    \@@_pilcrow_output:
    \bool_if:NT \l_@@_verse_para_bool
    {
      \hook_gput_next_code:nn { para / after }
        {
          \int_gset_eq:NN \g_@@_chap_par_prevgraf_int \prevgraf
          \int_compare:nNnT \g_@@_chap_par_prevgraf_int = 1
            { \penalty 10000 }
          \hook_gput_next_code:nn { para / before }
            {
              \int_set_eq:NN \clubpenalty \l_@@_clubpenalty_saved_int
            }
        }
    }
    \hook_gput_next_code:nn { para / begin }
      {
        \int_compare:nNnTF \g_@@_chap_par_prevgraf_int = \c_one_int
          {
            \dim_compare:nNnTF
              { \l_@@_hanging_leftmargin_tl } <
                { \g_@@_chap_width_dim + \l_@@_hanging_chap_sep_dim }
              {
                \parshape 2 ~
                  \dim_eval:n
                    {
                      \@totalleftmargin - \leftmargin + \g_@@_chap_width_dim +
                      \l_@@_hanging_chap_sep_dim
                    } ~
                  \dim_eval:n
                    {
                      \linewidth + \leftmargin - \g_@@_chap_width_dim -
                      \l_@@_hanging_chap_sep_dim
                    } ~
                  \@totalleftmargin ~ \linewidth
              }
              { \parshape 1 ~ \@totalleftmargin ~ \linewidth }
            \hook_gput_next_code:nn { para / begin }
              { \parshape 1 ~ \@totalleftmargin ~ \linewidth }
          }
          { \parshape 1 ~ \@totalleftmargin ~ \linewidth }
        \int_gzero:N \g_@@_chap_par_prevgraf_int
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_hanging_verse:n}
%   Position a \fn{vs} in a \env{hanging} environment. The verse is set to
%   overlap to the left if at the beginning of a hanging paragraph.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_hanging_verse:n
  {
    \mode_if_vertical:TF
      {
        \tl_set_eq:NN \l_tmpa_tl \l_@@_verse_sep_tl
        \tl_set_eq:NN \l_@@_verse_sep_tl \l_@@_hanging_verse_sep_tl
        \bool_lazy_and:nnTF
          { \legacy_if_p:n { @newlist } }
          { \g_@@_suppress_next_pilcrow_bool }
          {
            \strut
            \bool_if:NTF \l_@@_hanging_verse_right_bool
              {
                \hbox_overlap_left:n
                  {
                    \@@_verse_output:n { #1 }
                  }
              }
              {
                \hbox_overlap_left:n
                  {
                    \hbox_overlap_right:n
                      {
                        \@@_verse_output:n { #1 }
                      }
                    \skip_horizontal:N \l_@@_hanging_leftmargin_tl
                  }
              }
          }
          {
            \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool
            \strut
            \bool_if:NTF \l_@@_hanging_verse_right_bool
              {
                \hbox_overlap_left:n
                  {
                    \@@_verse_output:n { #1 }
                  }
              }
              {
                \hbox_overlap_left:n
                  {
                    \hbox_overlap_right:n
                      {
                        \@@_verse_output:n { #1 }
                      }
                    \skip_horizontal:N \l_@@_hanging_leftmargin_tl
                  }
              }
            \@@_pilcrow_output:
          }
        \tl_set_eq:NN \l_@@_verse_sep_tl \l_tmpa_tl
      }
      { \@@_verse_output:n { #1 } }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_nohang:}
%   Don't hang a paragraph in a \env{hanging} environment. Instead the
%   paragraph is indented by \cs{parindent} from its normal hanging position.
%    \begin{macrocode}
\cs_new_protected_nopar:Nn \@@_nohang:
  {
    \legacy_if:nTF {@newlist}
      { \skip_horizontal:n { \l_@@_hanging_hang_tl } }
      { \tex_noindent:D }
    \hbox_to_wd:nn { \l_@@_hanging_parindent_saved_dim } { }
    \peek_analysis_map_inline:n
      {
        \bool_lazy_or:nnT
          { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \vs }
          { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \newvs }
          {
            \bool_gset_true:N \g_@@_suppress_next_verse_para_bool
            \@@_set_pilcrow_hook:
          }
        \peek_analysis_map_break:n { ##1 }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_hanging_begin:n}
%   Begin a hanging section in a scripture quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_hanging_begin:n
  {
    \bool_if:NT \l_@@_active_inner_bool
      {
        \msg_error:nn { scripture } { nested-environment }
      }
    \bool_set_true:N \l_@@_active_inner_bool
    \str_set:Nn \l_@@_currenvir_str { hanging }
    \tl_if_novalue:nF { #1 }
      {
        \keys_set:nn
          { scripture / hanging }
          { #1 }
      }
    \DeclareDocumentCommand { \ch } { s o m }
      {
        \tl_if_novalue:nF { ##2 }
          {
            \tl_set:Nn \l_@@_X_char_tl { ##2 }
          }
        \@@_hanging_ch:n { ##3 }
      }
    \bool_if:NTF \l_@@_verse_para_bool
      { \cs_set_eq:NN \vs \@@_hanging_verse_para:n }
      { \cs_set_eq:NN \vs \@@_hanging_verse:n }
    \cs_set_eq:NN \nohang \@@_nohang:
    \dim_set_eq:NN \l_@@_hanging_parindent_saved_dim \parindent
    \legacy_if:nTF { @newlist }
      { \dim_add:Nn \l_@@_outer_itemindent_dim \itemindent }
      { \dim_zero:N \l_@@_outer_itemindent_dim }
    \cs_set_eq:NN \par \para_end:
    \hook_gclear_next_code:n { para / before }
    \int_gset_eq:NN \g_@@_current_group_level_b_int \currentgrouplevel
    \list { }
      {
        \bool_lazy_or:nnF
          { \mode_if_vertical_p: }
          { \g_@@_para_mode_vertical_bool }
          { \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool }
        \dim_zero:N \labelsep
        \dim_set:Nn \leftmargin { \l_@@_hanging_leftmargin_tl + \l_@@_hanging_hang_tl }
        \dim_set_eq:NN \rightmargin \l_@@_hanging_rightmargin_tl
        \dim_set:Nn \itemindent { -\l_@@_hanging_hang_tl - \l_@@_outer_itemindent_dim }
        \dim_set:Nn \listparindent { -\l_@@_hanging_hang_tl }
        \skip_set_eq:NN \parsep \parskip
        \skip_zero:N \partopsep
        \dim_compare:nNnTF \parskip > \l_@@_hanging_aboveskip_tl
          { \skip_zero:N \topsep }
          { \skip_set:Nn \topsep { \@@_skip_diff:NN \l_@@_hanging_aboveskip_tl \parskip } }
        \@@_setup_list_noindent:n { -\l_@@_hanging_hang_tl }
      }
    \int_compare:nNnT \g_@@_chap_par_prevgraf_int = 1
      { \addvspace { \baselineskip } }
    \int_gzero:N \g_@@_chap_par_prevgraf_int
    \item
    \relax
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_hanging_end:}
%   End a hanging section in a scripture quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_hanging_end:
  {
    \@@_calc_final_line_length:
    \dim_compare:nNnTF \@outerparskip > \l_@@_hanging_belowskip_tl
      { \skip_zero:N \@topsepadd }
      { \skip_set:Nn \@topsepadd { \@@_skip_diff:NN \l_@@_hanging_belowskip_tl \@outerparskip } }
    \skip_gset_eq:NN \g_@@_prev_inner_below_skip \@topsepadd
    \legacy_if_set_false:n { @noparlist }
    \endlist
    \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool
    \hook_gput_next_code:nn { para / begin }
      { \parshape 1 ~ \@totalleftmargin ~ \linewidth }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{The \env{midparachap} environment}
%
% \begin{macro}{\@@_vbox_set_top:Nw}
%   Define missing \cs{vbox_set_top:Nw} function.
%    \begin{macrocode}
\cs_new_protected:Npn \@@_vbox_set_top:Nw #1
  {
    \tex_setbox:D #1 \tex_vtop:D
      \c_group_begin_token
        \color_group_begin:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_mid_para_chap_bool}
%   Flag if setting a paragraph containing a mid-paragraph chapter.
%    \begin{macrocode}
\bool_new:N \l_@@_mid_para_chap_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_mid_para_chap_line_box}
%   Store last line before a mid-paragraph chapter.
%    \begin{macrocode}
\box_new:N \l_@@_mid_para_chap_line_box
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_mid_para_chap_prevdepth_dim}
%   Store the \cs{prevdepth} of the final paragraph in a \env{midparachap}
%   environment.
%    \begin{macrocode}
\dim_new:N \g_@@_mid_para_chap_prevdepth_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_mid_para_chap_totalleftmargin_dim}
%   Save the \cs{@totalleftmargin} before starting a \env{midparachap}
%   environment.
%    \begin{macrocode}
\dim_new:N \l_@@_mid_para_chap_totalleftmargin_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_mid_para_chap_prevgraf_int}
%   Store the \cs{prevgraf} of the final paragraph in a \env{midparachap}
%   environment.
%    \begin{macrocode}
\int_new:N \g_@@_mid_para_chap_prevgraf_int
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_mid_para_chap_snap_box}
%   Store unpacked last line before a mid-paragraph chapter.
%    \begin{macrocode}
\box_new:N \l_@@_mid_para_chap_snap_box
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_mid_para_chap_spacefactor_int}
%   Store space factor before a mid-paragraph chapter.
%    \begin{macrocode}
\int_new:N \l_@@_mid_para_chap_spacefactor_int
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_mid_para_chap_end_orig:n,
%               \@@_mid_para_chap_end:n}
% Custom \cs{end} macro for the \env{midparachap} environment. This is only
% used when the \opt{verse/para} and/or \opt{compact} options are in use.
%    \begin{macrocode}
\cs_set_eq:Nc \@@_mid_para_chap_end_orig:n { end ~ }
\cs_new_nopar:Nn \@@_mid_para_chap_end:n
  {
    \@@_mid_para_chap_end_orig:n { #1 }
    \bool_if:NT \l_@@_compact_bool
      { \c_space_token }
    \peek_remove_spaces:n
      {
        \peek_analysis_map_inline:n
          {
            \bool_case:n
              {
                { \exp_args:No \token_if_letter_p:N { ##1 } }
                  { \@@_pilcrow_output: }
                { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \vs }
                  { \@@_set_pilcrow_hook: }
                { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \newvs }
                  { \@@_set_pilcrow_hook: }
              }
            \peek_analysis_map_break:n { ##1 }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_mid_para_chap_box,
%               \l_@@_mid_para_chap_split_box,
%               \l_@@_mid_para_chap_split_top_box}
%   Boxes containing a paragraph with a chapter break and its split if needed.
%    \begin{macrocode}
\box_new:N \l_@@_mid_para_chap_box
\box_new:N \l_@@_mid_para_chap_split_box
\box_new:N \l_@@_mid_para_chap_split_top_box
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_mid_para_drop_chap_output:}
%   Output a mid-paragraph drop chapter.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_mid_para_drop_chap_output:
  {
    \unskip
    \int_set_eq:NN \l_@@_mid_para_chap_spacefactor_int \spacefactor
    \strut
    \par
    \box_set_to_last:N \l_@@_mid_para_chap_line_box
    \hbox_set:Nn \l_@@_mid_para_chap_snap_box
      {
        \hbox_unpack_drop:N \l_@@_mid_para_chap_line_box
        \unskip
        \unskip
        \unpenalty
      }
    \nointerlineskip
    \dim_compare:nNnTF
      {
        \box_wd:N \l_@@_mid_para_chap_snap_box +
        \g_@@_chap_width_dim +
        \l_@@_chap_sep_tl
      }
      <
      { \linewidth - \leftskip - \rightskip - 3em }
      {
        \@@_drop_chap_output:
        \hbox_unpack_drop:N \l_@@_mid_para_chap_snap_box
        \int_set_eq:NN \spacefactor \l_@@_mid_para_chap_spacefactor_int
        \c_space_tl
        \@@_verse_output:n { 1 }
      }
      {
        \group_begin:
        \noindent
        \skip_horizontal:n { -\leftskip }
        \hbox_unpack_drop:N \l_@@_mid_para_chap_snap_box
        \skip_zero:N \parfillskip
        \par
        \group_end:
        \@@_drop_chap_output:
        \bool_if:NT \l_@@_midparachap_show_verse_bool
          {
            \@@_verse_output:n { 1 }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_mid_para_chap_begin:n}
%   Begin a paragraph containing a mid-paragraph chapter.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_mid_para_chap_begin:n
  {
    \str_set:Nn \l_@@_currenvir_str { midparachap }
    \tl_if_novalue:nF { #1 }
      {
        \keys_set:nn
          { scripture / midparachap }
          { #1 }
      }
    \bool_lazy_and:nnT \l_@@_chap_show_verse_bool \l_@@_chap_drop_bool
      {
        \bool_set_true:N \l_@@_midparachap_show_verse_bool
        \bool_set_false:N \l_@@_chap_show_verse_bool
      }
    \par
    \bool_set_true:N \l_@@_mid_para_chap_bool
    \@@_vbox_set_top:Nw \l_@@_mid_para_chap_box
    \dim_zero:N \leftskip
    \dim_zero:N \rightskip
    \dim_set_eq:NN \l_@@_mid_para_chap_totalleftmargin_dim \@totalleftmargin
    \dim_zero:N \@totalleftmargin
    \dim_set_eq:NN \hsize \linewidth
    \skip_zero:N \parskip
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_mid_para_chap_end:}
%   End a paragraph containing a mid-paragraph chapter.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_mid_para_chap_end:
  {
    \par
    \dim_gset_eq:NN \g_@@_mid_para_chap_prevdepth_dim \prevdepth
    \box_set_to_last:N \l_@@_mid_para_chap_line_box
    \hbox_set:Nn \l_@@_mid_para_chap_snap_box
      {
        \hbox_unpack:N \l_@@_mid_para_chap_line_box
        \unskip
        \unskip
        \unpenalty
      }
    \dim_gset:Nn \g_@@_final_line_dim
      { \box_wd:N \l_@@_mid_para_chap_snap_box + \l_@@_mid_para_chap_totalleftmargin_dim }
    \box_clear:N \l_@@_mid_para_chap_snap_box
    \nointerlineskip
    \int_compare:nNnT
      \prevgraf < 3
      {
        \noindent
        \skip_horizontal:n { \g_@@_chap_width_dim + \l_@@_chap_sep_tl }
        \dim_gadd:Nn \g_@@_final_line_dim { \g_@@_chap_width_dim + \l_@@_chap_sep_tl }
      }
    \box_use_drop:N \l_@@_mid_para_chap_line_box
    \vbox_set_end:
%    \end{macrocode}
% Attempt to allow the mid-paragraph chapter box to break across pages.
%    \begin{macrocode}
    \mode_if_inner:TF
      {
        \noindent
        \box_use_drop:N \l_@@_mid_para_chap_box
      }
      {
        \dim_compare:nNnTF
          { \box_ht_plus_dp:N \l_@@_mid_para_chap_box }
          >
          { \pagegoal - \pagetotal - \baselineskip }
          {
            \int_set:Nn \vbadness { 10000 }
            \vbox_set_split_to_ht:NNn
              \l_@@_mid_para_chap_split_box \l_@@_mid_para_chap_box
              { \pagegoal - \pagetotal - \baselineskip }
            \vbox_set_top:Nn \l_@@_mid_para_chap_split_top_box
              { \vbox_unpack_drop:N \l_@@_mid_para_chap_split_box }
            \noindent
            \box_use_drop:N \l_@@_mid_para_chap_split_top_box
            \goodbreak
            \box_use_drop:N \l_@@_mid_para_chap_box
          }
          {
            \noindent
            \box_use_drop:N \l_@@_mid_para_chap_box
          }
      }
    \par
    \dim_set_eq:NN \prevdepth \g_@@_mid_para_chap_prevdepth_dim
    \int_zero:N \prevgraf
    \skip_vertical:n { -\parskip - \baselineskip }
    \noindent
    \skip_horizontal:N \g_@@_final_line_dim
    \int_gset_eq:NN \g_@@_chap_par_prevgraf_int \g_@@_mid_para_chap_prevgraf_int
    \int_gset:Nn \g_@@_current_group_level_a_int { \currentgrouplevel - 1 }
    \@@_reset_par_at_group_level:
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{The \env{narrow} environment}
%
% \begin{macro}{\@@_narrow_begin:n}
%   Begin a narrow section in a scripture quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_narrow_begin:n
  {
    \bool_if:NT \l_@@_active_inner_bool
      {
        \msg_error:nn { scripture } { nested-environment }
      }
    \bool_set_true:N \l_@@_active_inner_bool
    \str_set:Nn \l_@@_currenvir_str { narrow }
    \tl_if_novalue:nF { #1 }
      {
        \keys_set:nn
          { scripture / narrow }
          { #1 }
      }
    \legacy_if:nTF { @newlist }
      { \dim_add:Nn \l_@@_outer_itemindent_dim \itemindent }
      { \dim_zero:N \l_@@_outer_itemindent_dim }
    \cs_set_eq:NN \par \para_end:
    \int_gset_eq:NN \g_@@_current_group_level_b_int \currentgrouplevel
    \list { }
      {
        \dim_zero:N \labelsep
        \dim_set_eq:NN \leftmargin \l_@@_narrow_leftmargin_tl
        \dim_set_eq:NN \rightmargin \l_@@_narrow_rightmargin_tl
        \dim_set_eq:NN \listparindent \parindent
        \bool_lazy_or:nnTF
          { \mode_if_vertical_p: }
          { \g_@@_para_mode_vertical_bool }
          {
            \dim_set:Nn \itemindent { \parindent - \l_@@_outer_itemindent_dim }
            \@@_setup_list_noindent:n { \parindent }
          }
          {
            \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool
            \dim_set:Nn \itemindent { -\l_@@_outer_itemindent_dim }
            \@@_setup_list_noindent:n { \c_zero_dim }
          }
        \skip_set_eq:NN \parsep \parskip
        \skip_zero:N \partopsep
        \dim_compare:nNnTF \parskip > \l_@@_narrow_aboveskip_tl
          { \skip_zero:N \topsep }
          { \skip_set:Nn \topsep { \@@_skip_diff:NN \l_@@_narrow_aboveskip_tl \parskip } }
      }
    \int_compare:nNnT \g_@@_chap_par_prevgraf_int = 1
      { \addvspace { \baselineskip } }
    \int_gzero:N \g_@@_chap_par_prevgraf_int
    \bool_if:NT \l_@@_verse_para_bool
      { \cs_set_eq:NN \par \@@_para_par: }
    \item
    \relax
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_narrow_end:}
%   End a narrow section in a scripture quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_narrow_end:
  {
    \cs_set_eq:NN \par \para_end:
    \@@_calc_final_line_length:
    \dim_compare:nNnTF \@outerparskip > \l_@@_narrow_belowskip_tl
      { \skip_zero:N \@topsepadd }
      { \skip_set:Nn \@topsepadd { \@@_skip_diff:NN \l_@@_narrow_belowskip_tl \@outerparskip } }
    \skip_gset_eq:NN \g_@@_prev_inner_below_skip \@topsepadd
    \legacy_if_set_false:n { @noparlist }
    \endlist
    \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool
    \hook_gput_next_code:nn { para / begin }
      { \parshape 1 ~ \@totalleftmargin ~ \linewidth }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{The \env{poetry} environment}
%
% \begin{hooks}{scripture/poetry/para/after}
%   This hook is an internal hook used to adjust the \cs{parshape} within a
%   \env{poetry} environment after drop chapter numbers.
%    \begin{macrocode}
\hook_new:n { scripture / poetry / para / after }
%    \end{macrocode}
% \end{hooks}
%
% \begin{macro}{\g_@@_poetry_end_bool}
%   Flag indicating that a \env{poetry} environment just ended.
%    \begin{macrocode}
\bool_new:N \g_@@_poetry_end_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_poetry_midparachap_show_verse_bool}
%   Flag indicating whether the verse number should be printed immediately
%   after a \fn{ch} or not in a \env{poetry} environment.
%    \begin{macrocode}
\bool_new:N \l_@@_poetry_midparachap_show_verse_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_poetry_chap_indent_dim, \l_@@_poetry_chap_sep_dim}
%   Store calculated indent and sep when a drop chapter appears in a
%   \env{poetry} environment.
%    \begin{macrocode}
\dim_new:N \l_@@_poetry_chap_indent_dim
\dim_new:N \l_@@_poetry_chap_sep_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_poetry_chap_parshape_correction_dim}
%   Correction to \cs{parshape} in chapter affected lines in a \env{poetry}
%   environment.
%    \begin{macrocode}
\dim_new:N \l_@@_poetry_chap_parshape_correction_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_poetry_prevgraf_int}
%   Store the number of lines a line of poetry takes up.
%    \begin{macrocode}
\int_new:N \l_@@_poetry_prevgraf_int
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_poetry_text_right:nn}
%   Align a word to the right and finish a paragraph, pushing to the next line
%   if there is not space for the word.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_poetry_text_right:nn
  {
    {
      \unskip
      \hfil
      \penalty 50
      \skip_horizontal:n { #1 }
      \hbox:n {}
      \nobreak
      \hfill
      #2
      \skip_zero:N \parfillskip
      \int_zero:N \finalhyphendemerits
    }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_selah_output:}
%   Output Selah at the end of a line.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_selah_output:
  {
    \group_begin:
    \l_@@_selah_font_tl
    \@@_poetry_text_right:nn
      { \l_@@_selah_sep_tl }
      { \@@_selah_format:n { \l_@@_selah_text_tl } }
    \group_end:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_poetry_ch:n}
%   Position a chapter in a \env{poetry} environment.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_poetry_ch:n
  {
    \bool_if:NTF \l_@@_chap_show_bool
      {
        \bool_if:NTF \l_@@_chap_drop_bool
          { \@@_poetry_chap:n { #1 } }
          {
            \bool_if:NTF \l_@@_chap_para_bool
              { \@@_para_chap:n { #1 } }
              { \@@_poetry_nodrop_chap:n { #1 } }
          }
      }
      {
        \bool_if:NTF \l_@@_chap_para_bool
          { \@@_para_chap:n { #1 } }
          { \@@_poetry_nodrop_chap:n { #1 } }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_poetry_chap:n}
%   Position a drop chapter in a \env{poetry} environment.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_poetry_chap:n
  {
    \@@_drop_chap_set_up:n { #1 }
    \int_gset_eq:NN \g_@@_current_group_level_c_int \currentgrouplevel
    \@@_zero_chap_par_prevgraf_at_group_level:
    \cs_if_eq:NNTF \vs \@@_poetry_mode_vertical_verse:n
      {
        \dim_zero:N \l_@@_poetry_chap_indent_dim
        \noindent
      }
      {
        \dim_set_eq:NN \l_@@_poetry_chap_indent_dim \l_@@_poetry_indent_tl
        \mode_leave_vertical:
      }
    \dim_set_eq:NN \l_@@_poetry_chap_sep_dim \l_@@_chap_sep_tl
    \dim_compare:nNnT
      { \g_@@_chap_width_dim + \l_@@_chap_sep_tl }
      <
      { \l_@@_poetry_leftmargin_tl + \l_@@_poetry_chap_indent_dim }
      {
        \dim_set:Nn \l_@@_poetry_chap_sep_dim
          {
            \l_@@_poetry_leftmargin_tl + \l_@@_poetry_chap_indent_dim -
            \g_@@_chap_width_dim
          }
      }
    \hbox_set:Nn \l_@@_chap_box
      {
        \box_move_down:nn
          { \baselineskip }
          { 
            \hbox_overlap_left:n
              {
                \box_use:N \l_@@_chap_tmp_box
                \skip_horizontal:N \l_@@_poetry_chap_sep_dim
              }
          }
      }
    \box_set_ht:Nn \l_@@_chap_box { \c_zero_dim }
    \box_set_dp:Nn \l_@@_chap_box { \c_zero_dim }
    \dim_set:Nn \l_@@_poetry_chap_parshape_correction_dim
      {
        \g_@@_chap_width_dim + \l_@@_poetry_chap_sep_dim -
        \l_@@_poetry_leftmargin_tl - \l_@@_poetry_chap_indent_dim
      }
    \parshape 2 ~
      \dim_eval:n
        { \@totalleftmargin + \l_@@_poetry_chap_parshape_correction_dim } ~
      \dim_eval:n
        { \linewidth - \l_@@_poetry_chap_parshape_correction_dim } ~
      \dim_eval:n
        { \@totalleftmargin + \l_@@_poetry_big_indent_tl } ~
      \dim_eval:n
        { \linewidth - \l_@@_poetry_big_indent_tl }
%    \end{macrocode}
%   Set the \cs{parshape} for the second line after a drop chapter number.
%    \begin{macrocode}
    \dim_compare:nNnT
      { \g_@@_chap_width_dim + \l_@@_poetry_chap_sep_dim }
      >
      \l_@@_poetry_leftmargin_tl
      {
        \hook_gput_next_code:nn { scripture / poetry / para / after }
          {
            \int_compare:nNnT \l_@@_poetry_prevgraf_int = 1
              {
                \cs_if_eq:NNTF \vs \@@_poetry_mode_vertical_verse:n
%    \end{macrocode}
%   This \cs{parshape} is in effect when the next line is the first half of a
%   poetry verse.
%    \begin{macrocode}
                  {
                    \dim_compare:nNnTF
                      { \g_@@_chap_width_dim + \l_@@_chap_sep_tl }
                      <
                      \l_@@_poetry_leftmargin_tl
                      { \dim_zero:N \l_@@_poetry_chap_parshape_correction_dim }
                      {
                        \dim_set:Nn \l_@@_poetry_chap_parshape_correction_dim
                          {
                            \g_@@_chap_width_dim + \l_@@_chap_sep_tl -
                            \l_@@_poetry_leftmargin_tl
                          }
                      }
                    \int_compare:nNnT \g_@@_chap_par_prevgraf_int = 1
                      {
                        \parshape 2 ~
                          \dim_eval:n
                            { \@totalleftmargin + \l_@@_poetry_chap_parshape_correction_dim } ~
                          \dim_eval:n
                            { \linewidth - \l_@@_poetry_chap_parshape_correction_dim } ~
                          \dim_eval:n
                            { \@totalleftmargin + \l_@@_poetry_big_indent_tl } ~
                          \dim_eval:n
                            { \linewidth - \l_@@_poetry_big_indent_tl }
                      }
                  }
%    \end{macrocode}
%   This \cs{parshape} is in effect when the next line is the second half of a
%   poetry verse.
%    \begin{macrocode}
                  {
                    \dim_compare:nNnTF
                      { \g_@@_chap_width_dim + \l_@@_chap_sep_tl }
                      <
                      { \l_@@_poetry_leftmargin_tl + \l_@@_poetry_indent_tl }
                      { \dim_zero:N \l_@@_poetry_chap_parshape_correction_dim }
                      {
                        \dim_set:Nn \l_@@_poetry_chap_parshape_correction_dim
                          {
                            \g_@@_chap_width_dim + \l_@@_chap_sep_tl -
                            \l_@@_poetry_leftmargin_tl - \l_@@_poetry_indent_tl
                          }
                      }
                    \parshape 2 ~
                      \dim_eval:n
                        { \@totalleftmargin + \l_@@_poetry_chap_parshape_correction_dim } ~
                      \dim_eval:n
                        { \linewidth - \l_@@_poetry_chap_parshape_correction_dim } ~
                      \dim_eval:n
                        { \@totalleftmargin + \l_@@_poetry_big_indent_tl } ~
                      \dim_eval:n
                        { \linewidth - \l_@@_poetry_big_indent_tl }
                  }
              }
          }
      }
    \group_begin:
    \hook_use:n { scripture / chap / before }
    \box_use:N \l_@@_chap_box
    \hook_use:n { scripture / chap / after }
    \group_end:
    \bool_lazy_or:nnT \l_@@_chap_show_verse_bool \l_@@_poetry_midparachap_show_verse_bool
      { \@@_verse_output:n { 1 } }
    \hook_use:n { scripture / poetry / pilcrow }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_poetry_nodrop_chap:n}
%   Format a non-drop chapter for \env{poetry} environment in a
%   \env{scripture} quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_poetry_nodrop_chap:n
  {
    \cs_gset_nopar:Npn \scripturecurrentchapter { #1 }
    \cs_gset_nopar:Npn \scripturecurrentverse { 1 }
    \group_begin:
    \cs_if_eq:NNT \vs \@@_poetry_mode_vertical_verse:n
      { \noindent }
    \bool_if:NTF \l_@@_chap_show_bool
      {
        \hbox_overlap_left:n
          {
            \hook_use:n { scripture / chap / before }
            \group_begin:
            \l_@@_chap_font_tl
            \str_if_eq:VnF \l_@@_chapter_colour_tl { . }
              { \exp_args:NV \color_select:n \l_@@_chapter_colour_tl }
            \@@_chap_format:n { #1 }
            \group_end:
            \skip_horizontal:N \l_@@_chap_sep_tl
            \hook_use:n { scripture / chap / after }
            \bool_lazy_or:nnT \l_@@_chap_show_verse_bool \l_@@_poetry_midparachap_show_verse_bool
              { \@@_verse_output:n { 1 } }
          }
      }
      {
        \hook_use:n { scripture / chap / before }
        \hook_use:n { scripture / chap / after }
        \vs { 1 }
      }
    \group_end:
    \hook_use:n { scripture / poetry / pilcrow }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_poetry_mode_vertical_verse:n}
%   Format a verse for poetry scripture quotations in vertical mode.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_poetry_mode_vertical_verse:n
  {
    \group_begin:
    \tl_set_eq:NN \l_@@_verse_sep_tl \l_@@_poetry_verse_sep_tl
    \hook_gclear_next_code:n { scripture / pilcrow }
    \strut
    \int_compare:nNnTF \g_@@_chap_par_prevgraf_int = 1
      {
        \@@_verse_output:n { #1 }
      }
      {
        \bool_if:NTF \l_@@_poetry_verse_right_bool
          {
            \hbox_overlap_left:n
              {
                \@@_verse_output:n { #1 }
              }
          }
          {
            \hbox_overlap_left:n
              {
                \hbox_overlap_right:n
                  {
                    \@@_verse_output:n { #1 }
                  }
                \skip_horizontal:N \l_@@_poetry_leftmargin_tl
              }
          }
      }
    \group_end:
    \bool_if:NF \g_@@_suppress_next_pilcrow_bool
      { \hook_use:n { scripture / poetry / pilcrow } }
    \cs_set_eq:NN \vs \@@_verse_output:n
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_poetry_mode_horizontal_verse:n}
%   Format a verse for poetry scripture quotations in horizontal mode.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_poetry_mode_horizontal_verse:n
  {
    \group_begin:
    \tl_set_eq:NN \l_@@_verse_sep_tl \l_@@_poetry_verse_sep_tl
    \int_compare:nNnTF \g_@@_chap_par_prevgraf_int = 1
      {
        \@@_poetry_mode_vertical_verse:n { #1 }
      }
      {
        \skip_horizontal:n { -\listparindent }
        \@@_poetry_mode_vertical_verse:n { #1 }
        \skip_horizontal:N \listparindent
      }
    \group_end:
    \cs_set_eq:NN \vs \@@_verse_output:n
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_poetry_par:}
%   par macro for poetry sections
%    \begin{macrocode}
\cs_new_protected:Nn \@@_poetry_par:
  {
    \para_end:
    \int_set:Nn \l_@@_poetry_prevgraf_int { \int_use:N \prevgraf }
    \parshape 2 ~ 
      \@totalleftmargin ~
      \linewidth ~
      \dim_eval:n
        { \@totalleftmargin + \l_@@_poetry_big_indent_tl } ~
      \dim_eval:n
        { \linewidth - \l_@@_poetry_big_indent_tl }
    \hook_use:n { scripture / poetry / para / after }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_obeylines:}
%   Special version of obeylines which doesn't insert par at end of
%   environment.
%    \begin{macrocode}
\group_begin:
  \char_set_catcode_active:N \^^M
  \cs_gset_protected_nopar:Nn \@@_obeylines: %
    {%
      \char_set_catcode_active:N \^^M%
      \cs_set_eq:NN ^^M \@@_obeylines_eol:%
    }%
\group_end:
\cs_new_protected:Nn \@@_obeylines_eol:
  {
    \mode_if_vertical:TF
      {
        \cs_set_eq:NN \vs \@@_poetry_mode_vertical_verse:n
        \hook_gput_next_code:nn { scripture / poetry / para / after }
          { \bool_set_false:N \l_@@_poetry_midparachap_show_verse_bool }
      }
      { \cs_set_eq:NN \vs \@@_poetry_mode_horizontal_verse:n }
    \peek_analysis_map_inline:n
      {
        \bool_case:nF
          {
            { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \ch }
              {
                \bool_set_eq:NN \l_@@_poetry_midparachap_show_verse_bool \l_@@_midparachap_show_verse_bool
                \@@_poetry_par:
                \peek_analysis_map_break:n { ##1 }
              }
            { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \newch }
              {
                \bool_set_eq:NN \l_@@_poetry_midparachap_show_verse_bool \l_@@_midparachap_show_verse_bool
                \@@_poetry_par:
                \peek_analysis_map_break:n { ##1 }
              }
            { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \end }
              { \peek_analysis_map_break:n { ##1 } }
            { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \extraskip }
              { \peek_analysis_map_break:n { ##1 } }
            { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \nopilcrow }
              {
                \@@_poetry_par:
                \cs_if_eq:NNT \vs \@@_poetry_mode_vertical_verse:n
                  { \noindent }
                \peek_analysis_map_break:n
                  {
                    \@@_fix_protrusion:o { ##1 }
                  }
              }
            { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \vs }
              {
                \@@_poetry_par:
                \cs_if_eq:NNT \vs \@@_poetry_mode_vertical_verse:n
                  { \noindent }
                \peek_analysis_map_break:n { ##1 }
              }
            { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \newvs }
              {
                \@@_poetry_par:
                \cs_if_eq:NNT \vs \@@_poetry_mode_vertical_verse:n
                  { \noindent }
                \peek_analysis_map_break:n { ##1 }
              }
            { \exp_args:No \token_if_eq_meaning_p:NN { ##1 } \@@_obeylines_eol: }
              { \cs_set_eq:NN \vs \@@_poetry_mode_vertical_verse:n }
          }
          {
            \@@_poetry_par:
            \cs_if_eq:NNT \vs \@@_poetry_mode_vertical_verse:n
              { \noindent }
            \cs_set_eq:NN \vs \@@_verse_output:n
            \bool_if:NT \l_@@_verse_para_bool
              {
                \@@_pilcrow_output:
                \bool_set_false:N \l_@@_verse_para_bool
                \bool_set_false:N \l_@@_pilcrow_bool
              }
            \peek_analysis_map_break:n
              {
                \@@_fix_protrusion:o { ##1 }
              }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_poetry_begin:}
%   Begin a poetry section in a scripture quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_poetry_begin:
  {
    \bool_if:NT \l_@@_active_inner_bool
      {
        \msg_error:nn { scripture } { nested-environment }
      }
    \bool_set_true:N \l_@@_active_inner_bool
    \str_set:Nn \l_@@_currenvir_str { poetry }
    \bool_gset_false:N \g_@@_poetry_midparachap_show_verse_bool
    \DeclareDocumentCommand { \ch } { s o m }
      {
        \tl_if_novalue:nF { ##2 }
          {
            \tl_set:Nn \l_@@_X_char_tl { ##2 }
          }
        \@@_poetry_ch:n { ##3 }
      }
    \cs_set_eq:NN \vs \@@_poetry_mode_vertical_verse:n
    \cs_set_eq:NN \selah \@@_selah_output:
    \cs_set_protected_nopar:Npn \textright ##1
      { \@@_poetry_text_right:nn { \l_@@_text_right_sep_tl } { ##1 } }
    \legacy_if:nTF { @newlist }
      { \dim_add:Nn \l_@@_outer_itemindent_dim \itemindent }
      { \dim_zero:N \l_@@_outer_itemindent_dim }
    \cs_set_eq:NN \par \para_end:
    \cs_set_eq:NN \noindent \tex_noindent:D
    \hook_gclear_next_code:n { para / before }
    \hook_gput_next_code:nn { scripture / poetry / pilcrow }
      {
        \@@_pilcrow_output:
        \bool_set_false:N \l_@@_pilcrow_bool
        \bool_set_false:N \l_@@_verse_para_bool
      }
    \int_gset_eq:NN \g_@@_current_group_level_b_int \currentgrouplevel
    \list { }
      {
        \bool_lazy_or:nnF
          { \mode_if_vertical_p: }
          { \g_@@_para_mode_vertical_bool }
          { \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool }
        \dim_zero:N \labelsep
        \dim_set_eq:NN \leftmargin \l_@@_poetry_leftmargin_tl
        \dim_set_eq:NN \rightmargin \l_@@_poetry_rightmargin_tl
        \dim_set:Nn \itemindent { \l_@@_poetry_indent_tl - \l_@@_outer_itemindent_dim }
        \dim_set_eq:NN \listparindent \l_@@_poetry_indent_tl
        \skip_zero:N \parsep
        \skip_zero:N \partopsep
        \dim_compare:nNnTF \parskip > { \l_@@_poetry_aboveskip_tl }
          { \skip_zero:N \topsep }
          { \skip_set:Nn \topsep { \@@_skip_diff:NN \l_@@_poetry_aboveskip_tl \parskip } }
        \@@_setup_list_noindent:n { \l_@@_poetry_indent_tl }
      }
    \int_compare:nNnT \g_@@_chap_par_prevgraf_int = 1
      { \addvspace { \baselineskip } }
    \int_gzero:N \g_@@_chap_par_prevgraf_int
    \raggedright
    \dim_set_eq:NN \parindent \l_@@_poetry_indent_tl
    \item
    \relax
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_poetry_end:}
%   End a poetry section in a scripture quotation.
%    \begin{macrocode}
\cs_new_protected:Nn \@@_poetry_end:
  {
    \@@_calc_final_line_length:
    \dim_compare:nNnTF \@outerparskip > { \l_@@_poetry_belowskip_tl }
      { \skip_zero:N \@topsepadd }
      { \skip_set:Nn \@topsepadd { \@@_skip_diff:NN \l_@@_poetry_belowskip_tl \@outerparskip } }
    \skip_gset_eq:NN \g_@@_prev_inner_below_skip \@topsepadd
    \legacy_if_set_false:n { @noparlist }
    \endlist
    \bool_gset_true:N \g_@@_suppress_next_pilcrow_bool
    \hook_gclear_next_code:n { scripture / poetry / pilcrow }
    \bool_gset_true:N \g_@@_poetry_end_bool
    \hook_gput_next_code:nn { para / begin }
      {
        \bool_gset_false:N \g_@@_poetry_end_bool
        \parshape 1 ~ \@totalleftmargin ~ \linewidth
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{Public \LaTeX{} Interface}
%
% \begin{macro}{\scripturecurrentchapter, \scripturecurrentverse}
%   Globally stores the most recent argument of \fn{ch} and \fn{vs}. These
%   could be used in hooks, for example.
%    \begin{macrocode}
\cs_set_nopar:Npn \scripturecurrentchapter { }
\cs_set_nopar:Npn \scripturecurrentverse { }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\scripturesetup}
%   \begin{arguments}
%     \item \meta{|options|} to set.
%   \end{arguments}
%   Set key-value settings.
%    \begin{macrocode}
\NewDocumentCommand { \scripturesetup } { m }
  {
    \keys_set:nn { scripture } { #1 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\scripturestyle}
%   \begin{arguments}
%     \item \meta{|name|} of the style.
%     \item \meta{|options|} to set for the style.
%   \end{arguments}
%   Set key-value settings to be applied when using the \opt{style} option
%   with value \val{name}. You may want to pass \opt{defaults} as the first
%   option to ensure any unset options in your style are expected defaults.
%   The starred version appends the \val{options} to any existing ones.
%    \begin{macrocode}
\NewDocumentCommand { \scripturestyle } { s m m }
  {
    \@@_setup_style:nnn { #1 } { #2 } { #3 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\textscripture}
%   \begin{arguments}
%     \item \meta{|reference|} of quotation.
%     \item \meta{|options|} to set.
%     \item \meta{|quotation|} text.
%   \end{arguments}
%   Set an inline quotation. This is equivalent to calling the
%   \env{scripture} environment with the \opt{inline} option set.
%    \begin{macrocode}
\NewDocumentCommand { \textscripture } { o o +m }
  {
    \tl_if_novalue:nTF { #2 }
      {
        \begin { scripture } [ #1 ] [ inline ]
      }
      {
        \begin { scripture } [ #1 ] [ inline, #2 ]
      }
    #3
    \end { scripture }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{envmacro}{scripture}
%   \begin{arguments}
%     \item \meta{|reference|} of quotation.
%     \item \meta{|options|} to set.
%   \end{arguments}
%   Format a scripture quotation with optional reference.
%    \begin{macrocode}
\NewDocumentEnvironment { scripture } { o o }
  {
    \@@_begin:nn { #1 } { #2 }
%    \end{macrocode}
% \begin{envmacro}{center}
%   \begin{arguments}
%     \item \meta{|options|} to set.
%   \end{arguments}
%    \begin{macrocode}
    \DeclareDocumentEnvironment { center } { o }
      {
        \@@_center_begin:n { ##1 }
        \@@_reference_start_peek:
      }
      { \@@_center_end: }
%    \end{macrocode}
% \end{envmacro}
% \begin{envmacro}{flushright}
%   \begin{arguments}
%     \item \meta{|options|} to set.
%   \end{arguments}
%    \begin{macrocode}
    \DeclareDocumentEnvironment { flushright } { o }
      {
        \@@_flushright_begin:n { ##1 }
        \@@_reference_start_peek:
      }
      { \@@_flushright_end: }
%    \end{macrocode}
% \end{envmacro}
% \begin{envmacro}{hanging}
%   \begin{arguments}
%     \item \meta{|options|} to set.
%   \end{arguments}
%    \begin{macrocode}
    \DeclareDocumentEnvironment { hanging } { o }
      {
        \@@_hanging_begin:n { ##1 }
        \@@_reference_start_peek:
      }
      { \@@_hanging_end: }
%    \end{macrocode}
% \end{envmacro}
% \vspace{-2\baselineskip}
% \begin{envmacro}{midparachap}
%    \begin{macrocode}
    \DeclareDocumentEnvironment { midparachap } { o }
      {
        \@@_mid_para_chap_begin:n { ##1 }
        \@@_reference_start_peek:
      }
      { \@@_mid_para_chap_end: }
%    \end{macrocode}
% \end{envmacro}
% \begin{envmacro}{narrow}
%   \begin{arguments}
%     \item \meta{|options|} to set.
%   \end{arguments}
%    \begin{macrocode}
    \DeclareDocumentEnvironment { narrow } { o }
      {
        \@@_narrow_begin:n { ##1 }
        \@@_reference_start_peek:
      }
      { \@@_narrow_end: }
%    \end{macrocode}
% \end{envmacro}
% \begin{envmacro}{poetry}
%   \begin{arguments}
%     \item \meta{|options|} to set.
%   \end{arguments}
% The \val{poetryaux} environment is required because \cs{@@_obeylines:}
% breaks the reading of optional arguments.
%    \begin{macrocode}
    \DeclareDocumentEnvironment { poetryaux } { o }
      {
        \tl_if_novalue:nF { ##1 }
          {
            \keys_set:nn
              { scripture / poetry }
              { ##1 }
          }
        \@@_poetry_begin:
        \@@_reference_start_peek:
      }
      { \@@_poetry_end: }
    \DeclareDocumentEnvironment { poetry } { }
      {
        \@@_obeylines:
        \poetryaux
      }
      { \endpoetryaux }
%    \end{macrocode}
% \end{envmacro}
%    \begin{macrocode}
    \bool_if:NT \l_@@_inline_bool
      {
        \tl_set:Nn \l_@@_aboveskip_tl { 0pt }
        \tl_set:Nn \l_@@_belowskip_tl { 0pt }
        \tl_set:Nn \l_@@_leftmargin_tl { 0pt }
        \tl_set:Nn \l_@@_rightmargin_tl { 0pt }
        \cs_set_eq:NN \@@_ref_format:n \@@_inline_ref_format:n
        \tl_set_eq:NN \l_@@_ref_sep_tl \l_@@_inline_ref_sep_tl
        \cs_set_eq:NN \@@_version_format:n \@@_inline_version_format:n
        \tl_set_eq:NN \l_@@_version_delim_tl \l_@@_inline_version_delim_tl
        \bool_set_false:N \l_@@_chap_para_bool
        \bool_set_true:N \l_@@_compact_bool
        \bool_set_false:N \l_@@_heading_show_bool
      }
    \bool_if:NT \l_@@_chap_para_bool
      {
        \RenewDocumentEnvironment { midparachap } { o } { \ignorespaces } { \unskip }
      }
    \bool_if:NT \l_@@_verse_para_bool
      {
        \cs_set_eq:NN \vs \@@_verse_para_output:n
        \cs_set_eq:NN \par \@@_para_par:
        \cs_set_eq:NN \@par \@@_para_par:
        \cs_set_eq:NN \@doendpe \@@_doendpe:
        \cs_set_eq:NN \noindent \@@_para_noindent:
        \cs_set_protected:Npn \\
          {
            \mode_if_horizontal:TF
              { \unskip }
              { \@nolnerr }
          }
        \RenewDocumentEnvironment { midparachap } { o }
          {
            \str_set:Nn \l_@@_currenvir_str { midparachap }
            \cs_set_eq:NN \noindent \tex_noindent:D
            \cs_set_eq:cN { end ~ } \@@_mid_para_chap_end:n
            \@@_reference_start_peek:
          }
          {
            \para_end:
            \bool_gset_false:N \g_@@_suppress_next_pilcrow_bool
          }
      }
    \bool_if:NT \l_@@_compact_bool
      {
        \cs_set_eq:NN \noindent \@@_para_noindent:
        \bool_if:NF \l_@@_verse_para_bool
          {
            \bool_set_false:N \l_@@_chap_drop_bool
            \bool_set_false:N \l_@@_chap_drop_llap_bool
            \bool_set_false:N \l_@@_chap_drop_smash_bool
            \bool_set_false:N \l_@@_chap_para_bool
            \cs_set_eq:NN \vs \@@_verse_compact_output:n
          }
        \bool_gset:Nn \g_@@_mode_vertical_inner_bool
          { \mode_if_vertical_p: }
        \RenewDocumentEnvironment { center } { o }
          {
            \str_set:Nn \l_@@_currenvir_str { center }
            \@@_reference_start_peek:
          }
          { \@@_compact_end_inner: }
        \RenewDocumentEnvironment { flushright } { o }
          {
            \str_set:Nn \l_@@_currenvir_str { flushright }
            \@@_reference_start_peek:
          }
          { \@@_compact_end_inner: }
        \RenewDocumentEnvironment { hanging } { o }
          {
            \str_set:Nn \l_@@_currenvir_str { hanging }
            \@@_reference_start_peek:
          }
          { \@@_compact_end_inner: }
        \RenewDocumentEnvironment { midparachap } { o }
          {
            \str_set:Nn \l_@@_currenvir_str { midparachap }
            \cs_set_eq:cN { end ~ } \@@_mid_para_chap_end:n
            \@@_reference_start_peek:
          }
          { \@@_compact_end_inner: }
        \RenewDocumentEnvironment { narrow } { o }
          {
            \str_set:Nn \l_@@_currenvir_str { narrow }
            \@@_reference_start_peek:
          }
          { \@@_compact_end_inner: }
        \RenewDocumentEnvironment { poetry } { o }
          {
            \str_set:Nn \l_@@_currenvir_str { poetry }
            \@@_reference_start_peek:
          }
          { \@@_compact_end_inner: }
        \cs_set_eq:NN \\ \unskip
        \cs_set_eq:NN \par \@@_compact_par:
        \cs_set_eq:NN \extraskip \relax
        \cs_set_eq:NN \nohang \relax
        \cs_set:Npn \selah
          {
            \group_begin:
            \l_@@_selah_font_tl
            \c_space_tl
            \@@_selah_format:n { \l_@@_selah_text_tl }
            \c_space_tl
            \group_end:
          }
        \cs_set_protected_nopar:Npn \textright ##1
          {
            \unskip
            \c_space_tl
            ##1
          }
      }
    \@@_reference_start_peek:
  }
  {
    \bool_lazy_or:nnT \l_@@_compact_bool \l_@@_verse_para_bool
      { \cs_set_eq:NN \par \para_end: }
    \@@_end:
  }
%    \end{macrocode}
% \end{envmacro}
%    \begin{macrocode}
%</package>
%    \end{macrocode}
% \end{implementation}
%
% \PrintChanges
%
% \PrintIndex
