summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r--Master/texmf-dist/source/lualatex/piton/piton.dtx440
1 files changed, 221 insertions, 219 deletions
diff --git a/Master/texmf-dist/source/lualatex/piton/piton.dtx b/Master/texmf-dist/source/lualatex/piton/piton.dtx
index e308e226b96..c8f13eabb56 100644
--- a/Master/texmf-dist/source/lualatex/piton/piton.dtx
+++ b/Master/texmf-dist/source/lualatex/piton/piton.dtx
@@ -72,12 +72,12 @@
% \iffalse
%<*STY>
% \fi
-\def\PitonFileVersion{2.7}
-\def\PitonFileDate{2024/03/24}
+\def\PitonFileVersion{2.7a}
+\def\PitonFileDate{2024/03/30}
% \iffalse
%</STY>
%<*LUA>
-piton_version = "2.7" -- 2024/03/24
+piton_version = "2.7a" -- 2024/03/30
%</LUA>
%\fi
%
@@ -359,9 +359,8 @@ piton_version = "2.7" -- 2024/03/24
% the part~\ref{API}, p.~\pageref{API}).} of the current environment in
% that file. At the first use of a file by \pkg{piton}, it is erased.
%
-% \item \index{path-write}\colorbox{yellow!50}{\bfseries New 2.5}\enskip The key
-% \Definition{path-write} specifies a path where the files written by the key
-% |write| will be written.
+% \item \index{path-write} The key \Definition{path-write} specifies a path
+% where the files written by the key |write| will be written.
%
% \item \index{line-numbers} The key \Definition{line-numbers} activates the
% line numbering in the environments |{Piton}| and in the listings resulting
@@ -371,14 +370,15 @@ piton_version = "2.7" -- 2024/03/24
% \begin{itemize}
% \item With the key \Definition{line-numbers/skip-empty-lines}, the empty lines
% (which contains only spaces) are considered as non existent for the line
-% numbering (if the key |/absolute| is in force, the key |/skip-empty-lines| is
-% no-op in |\PitonInputFile|). The initial value of that key is |true| (and not
-% |false|).\footnote{For the language Python, the empty lines in the docstrings
-% are taken into account (by design).}
+% numbering (if the key |/absolute|, described below, is in force, the key
+% |/skip-empty-lines| is no-op in |\PitonInputFile|). The initial value of that
+% key is |true| (and not |false|).\footnote{For the language Python, the empty
+% lines in the docstrings are taken into account (by design).}
% \item With the key \Definition{line-numbers/label-empty-lines}, the labels
% (that is to say the numbers) of the empty lines are displayed. If the key
% |/skip-empty-line| is in force, the clé |/label-empty-lines| is no-op. The
-% initial value of that key is~|true|.
+% initial value of that key is~|true|.\footnote{When the key
+% |split-on-empty-lines| is in force, the labels of the empty are never printed.}
% \item With the key \Definition{line-numbers/absolute}, in the listings
% generated in |\PitonInputFile|, the numbers of the lines displayed are
% \emph{absolute} (that is to say: they are the numbers of the lines in the
@@ -783,43 +783,51 @@ piton_version = "2.7" -- 2024/03/24
% By default, the listings produced by the environment |{Piton}| and the command
% |\PitonInputFile| are not breakable.
%
-% However, the command |\PitonOptions| provides the key \Definition{splittable}
-% to allow such breaks.
+% However, the command |\PitonOptions| provides the keys |split-on-empty-lines|
+% and |splittable| to allow such breaks.
%
% \begin{itemize}
-% \item If the key |splittable| is used without any value, the
-% listings are breakable everywhere.
-% \item If the key |splittable| is used with a numeric value~$n$ (which must be
-% a non-negative integer number), the listings are breakable but no break will
-% occur within the first $n$ lines and within the last $n$ lines. Therefore,
-% |splittable=1| is equivalent to |splittable|.
-% \end{itemize}
+% \item \colorbox{yellow!50}{\textbf{New 2.7}}\par\nobreak
+% The key \Definition{split-on-empty-lines} allows breaks on the empty
+% lines\footnote{The ``empty lines'' are the lines which contains only spaes.} in
+% the listing. In the informatic listings, the empty lines usually seperate the
+% definitions of the informatic functions and it's pertinent to allow breaks
+% between these functions.
+%
+% In fact, when the key |split-on-empty-lines| is in force, the work goes a
+% little further than merely allowing page breaks: several successive empty lines
+% are deleted and replaced by the content of the parameter corresponding to the
+% key \Definition{split-separation}. The initial value of this parameter is
+% |\vspace{\baselineskip}\vspace{-1.25pt}| which corresponds eventually to an
+% empty line in the final PDF (this vertical space is deleted if it occurs on a
+% page break).
+%
+% \item Of course, the key |split-on-empty-lines| may not be sufficient and
+% that's why \pkg{piton} provides the key \Definition{splittable}.
+%
+% When the key |splittable| is used with the numeric value~$n$ (which must be a
+% positive integer) the listing, or each part of the listing delimited by empty
+% lines (when |split-on-empty-lines| is in force) may be broken anywhere with
+% the restriction that no break will occur within the $n$ first lines of
+% the listing or within the $n$ last lines. For example, a tuning with
+% |splittable = 4| may be a good choice.
+%
+% When used without value, the key |splittable| is equivalent to
+% |splittable = 1| and the listings may be broken anywhere (it's probably
+% not recommandable).
+% \end{itemize}
+%
+%
%
% \medskip
% Even with a background color (set by the key |background-color|), the pages
-% breaks are allowed, as soon as the key |splittable| is in force.\footnote{With
-% the key |splittable|, the environments \texttt{\{Piton\}} are breakable, even
-% within a (breakable) environment of \pkg{tcolorbox}. Remind that an
-% environment of \pkg{tcolorbox} included in another environment of
-% \pkg{tcolorbox} is \emph{not} breakable, even when both environments use the
-% key |breakable| of \pkg{tcolorbox}.}
-%
-% \bigskip
-% \colorbox{yellow!50}{\textbf{New 6.27}}\enskip The extension \pkg{piton}
-% provides a key \Definition{split-on-empty-lines}. When that key is in force,
-% the listings are split in chunks on the empty lines\footnote{The ``empty
-% lines'' are the lines which contain only spaces} of the code and each chunk is
-% treated by \pkg{piton} as an independent listing before being sent to LaTeX.
-% Thus, \textbf{LaTeX is able to add page breaks between the chunks}. If the key
-% |splittable| is used, it's active in each chunk. Of course, the utilisation of
-% both |split-on-empty-lines| and |splittable| makes sens if the key
-% |splittable| with a value different of 1 (for instance 4), so that the pages
-% breaks are prioritised on the empty lines of the original listing.
+% breaks are allowed, as soon as the key |split-on-empty-lines| or the key
+% |splittable| is in force.\footnote{With the key |splittable|, the environments
+% \texttt{\{Piton\}} are breakable, even within a (breakable) environment of
+% \pkg{tcolorbox}. Remind that an environment of \pkg{tcolorbox} included in
+% another environment of \pkg{tcolorbox} is \emph{not} breakable, even when both
+% environments use the key |breakable| of \pkg{tcolorbox}.}
%
-% \smallskip
-% The key \Definition{split-separation} specifies a list of LaTeX tokens that
-% will be inserted between the chunks. For example :
-% |\PitonOptions{split-separation = \hrule\goodbreak}|.
%
% \subsubsection{Line breaks}
%
@@ -2479,7 +2487,6 @@ piton_version = "2.7" -- 2024/03/24
\cs_new_protected:Npn \@@_fatal:n { \msg_fatal:nn { piton } }
\cs_new_protected:Npn \@@_fatal:nn { \msg_fatal:nnn { piton } }
\cs_new_protected:Npn \@@_msg_new:nn { \msg_new:nnn { piton } }
-\cs_new_protected:Npn \@@_msg_new:nnn { \msg_new:nnnn { piton } }
\cs_new_protected:Npn \@@_gredirect_none:n #1
{
\group_begin:
@@ -2489,6 +2496,40 @@ piton_version = "2.7" -- 2024/03/24
}
% \end{macrocode}
%
+% With Overleaf, by default, a document is compiled in non-stop mode. When there
+% is an error, there is no way to the user to use the key H in order to have
+% more information. That's why we decide to put that piece of information (for
+% the messages with such information) in the main part of the message when the
+% key |messages-for-Overleaf| is used (at load-time).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_msg_new:nnn #1 #2 #3
+ {
+ \bool_if:NTF \g_@@_messages_for_Overleaf_bool
+ { \msg_new:nnn { piton } { #1 } { #2 \\ #3 } }
+ { \msg_new:nnnn { piton } { #1 } { #2 } { #3 } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We also create a command which will generate usually an error but only a
+% warning on Overleaf. The argument is given by curryfication.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_error_or_warning:n
+ { \bool_if:NTF \g_@@_messages_for_Overleaf_bool \@@_warning:n \@@_error:n }
+% \end{macrocode}
+%
+% We try to detect whether the compilation is done on Overleaf. We use
+% |\c_sys_jobname_str| because, with Overleaf, the value of |\c_sys_jobname_str|
+% is always ``|output|''.
+% \begin{macrocode}
+\bool_new:N \g_@@_messages_for_Overleaf_bool
+\bool_gset:Nn \g_@@_messages_for_Overleaf_bool
+ {
+ \str_if_eq_p:on \c_sys_jobname_str { _region_ } % for Emacs
+ || \str_if_eq_p:on \c_sys_jobname_str { output } % for Overleaf
+ }
+% \end{macrocode}
+%
% \bigskip
% \begin{macrocode}
\@@_msg_new:nn { LuaLaTeX~mandatory }
@@ -2513,7 +2554,7 @@ piton_version = "2.7" -- 2024/03/24
\@@_msg_new:nnn { piton.lua~not~found }
{
The~file~'piton.lua'~can't~be~found.\\
- The~package~'piton'~won't~be~loaded.\\
+ This~eror~is~fatal.\\
If~you~want~to~know~how~to~retrieve~the~file~'piton.lua',~type~H~<return>.
}
{
@@ -2526,10 +2567,11 @@ piton_version = "2.7" -- 2024/03/24
% \bigskip
% \begin{macrocode}
\file_if_exist:nF { piton.lua }
- { \msg_critical:nn { piton } { piton.lua~not~found } }
+ { \msg_fatal:nn { piton } { piton.lua~not~found } }
% \end{macrocode}
%
%
+%
% \bigskip
% The boolean |\g_@@_footnotehyper_bool| will indicate if the option
% |footnotehyper| is used.
@@ -2707,7 +2749,7 @@ piton_version = "2.7" -- 2024/03/24
% \end{macrocode}
%
% \medskip
-% Each time the command |\PitonInputFile| or an environment of \pkg{piton} is
+% Each time the command |\PitonInputFile| of \pkg{piton} is
% used, the code of that environment will be stored in the following global string.
% \begin{macrocode}
\tl_new:N \g_piton_last_code_tl
@@ -2776,6 +2818,7 @@ piton_version = "2.7" -- 2024/03/24
% by the final user is split in chunks on the empty lines in the code).
% \begin{macrocode}
\tl_new:N \l_@@_split_separation_tl
+\tl_set:Nn \l_@@_split_separation_tl { \vspace{\baselineskip} \vspace{-1.25pt} }
% \end{macrocode}
%
% \medskip
@@ -3103,6 +3146,7 @@ piton_version = "2.7" -- 2024/03/24
% \bigskip
% \subsubsection{Treatment of a line of code}
%
+% The following command is only used once.
% \begin{macrocode}
\cs_new_protected:Npn \@@_replace_spaces:n #1
{
@@ -3178,7 +3222,6 @@ piton_version = "2.7" -- 2024/03/24
\l_@@_skip_empty_lines_bool
}
{ \int_gincr:N \g_@@_visual_line_int }
-
\bool_if:nT
{
! \str_if_eq_p:nn { #1 } { \PitonStyle {Prompt}{} }
@@ -3186,7 +3229,6 @@ piton_version = "2.7" -- 2024/03/24
( ! \l_@@_skip_empty_lines_bool && \l_@@_label_empty_lines_bool )
}
\@@_print_number:
-
}
% \end{macrocode}
% If there is a background, we must remind that there is a left margin of 0.5~em
@@ -3320,9 +3362,9 @@ piton_version = "2.7" -- 2024/03/24
{ \l_@@_nb_lines_int - \g_@@_line_int } > \l_@@_splittable_int
{
\egroup
- \bool_if:NT \g_@@_footnote_bool { \endsavenotes }
+ \bool_if:NT \g_@@_footnote_bool \endsavenotes
\par \mode_leave_vertical:
- \bool_if:NT \g_@@_footnote_bool { \savenotes }
+ \bool_if:NT \g_@@_footnote_bool \savenotes
\vtop \bgroup
}
}
@@ -3677,6 +3719,13 @@ piton_version = "2.7" -- 2024/03/24
\int_new:N \g_@@_visual_line_int
% \end{macrocode}
%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_incr_visual_line:
+ {
+ \bool_if:NF \l_@@_skip_empty_lines_bool
+ { \int_gincr:N \g_@@_visual_line_int }
+ }
+% \end{macrocode}
%
% \begin{macrocode}
\cs_new_protected:Npn \@@_print_number:
@@ -4058,7 +4107,8 @@ piton_version = "2.7" -- 2024/03/24
\lua_now:e
{ piton.write = "\l_@@_path_write_str / \l_@@_write_str" }
}
- \str_if_empty:NF \l_@@_write_str
+ \str_if_empty:NTF \l_@@_write_str
+ { \lua_now:n { piton.write = '' } }
{
\seq_if_in:NVTF \g_@@_write_seq \l_@@_write_str
{ \lua_now:n { piton.write_mode = "a" } }
@@ -4223,7 +4273,7 @@ piton_version = "2.7" -- 2024/03/24
{
\bool_if:NTF \g_@@_beamer_bool
{ \begin { uncoverenv } < #1 > }
- { \@@_error:n { overlay~without~beamer } }
+ { \@@_error_or_warning:n { overlay~without~beamer } }
}
\group_begin:
\int_zero_new:N \l_@@_first_line_int
@@ -4242,7 +4292,7 @@ piton_version = "2.7" -- 2024/03/24
&& ! \str_if_empty_p:N \l_@@_begin_range_str
}
{
- \@@_error:n { bad~range~specification }
+ \@@_error_or_warning:n { bad~range~specification }
\int_zero:N \l_@@_first_line_int
\int_set_eq:NN \l_@@_last_line_int \c_max_int
}
@@ -4268,7 +4318,7 @@ piton_version = "2.7" -- 2024/03/24
{ \l_@@_number_lines_start_int - 1 }
}
% \end{macrocode}
-% The following case arise when the code |line-numbers/absolute| is in force
+% The following case arises when the code |line-numbers/absolute| is in force
% without the use of a marked range.
% \begin{macrocode}
\int_compare:nNnT \g_@@_visual_line_int < \c_zero_int
@@ -4287,18 +4337,16 @@ piton_version = "2.7" -- 2024/03/24
\@@_compute_left_margin:no { CountNonEmptyLinesFile } \l_@@_file_name_str
\@@_compute_width:
\ttfamily
- \bool_if:NT \g_@@_footnote_bool { \savenotes }
- \vtop \bgroup
+ % \leavevmode
\lua_now:e
{
piton.ParseFile(
'\l_piton_language_str' ,
'\l_@@_file_name_str' ,
\int_use:N \l_@@_first_line_int ,
- \int_use:N \l_@@_last_line_int )
+ \int_use:N \l_@@_last_line_int ,
+ \bool_if:NTF \l_@@_split_on_empty_lines_bool { 1 } { 0 } )
}
- \egroup
- \bool_if:NT \g_@@_footnote_bool { \endsavenotes }
\bool_if:NT \l_@@_width_min_bool \@@_width_to_aux:
\group_end:
% \end{macrocode}
@@ -4567,39 +4615,6 @@ piton_version = "2.7" -- 2024/03/24
}
% \end{macrocode}
%
-% \bigskip
-% \begin{macrocode}
-\keys_define:nn { PitonOptions }
- { identifiers .code:n = \@@_set_identifiers:n { #1 } }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\keys_define:nn { Piton / identifiers }
- {
- names .clist_set:N = \l_@@_identifiers_names_tl ,
- style .tl_set:N = \l_@@_style_tl ,
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_set_identifiers:n #1
- {
- \@@_error:n { key~identifiers~deprecated }
- \@@_gredirect_none:n { key~identifiers~deprecated }
- \clist_clear_new:N \l_@@_identifiers_names_tl
- \tl_clear_new:N \l_@@_style_tl
- \keys_set:nn { Piton / identifiers } { #1 }
- \clist_map_inline:Nn \l_@@_identifiers_names_tl
- {
- \tl_set_eq:cN
- { PitonIdentifier _ \l_piton_language_str _ ##1 }
- \l_@@_style_tl
- }
- }
-% \end{macrocode}
-%
%
% \bigskip
% In particular, we have an highlighting of the indentifiers which are the
@@ -4735,15 +4750,6 @@ piton_version = "2.7" -- 2024/03/24
}
% \end{macrocode}
%
-% \begin{macrocode}
-\@@_msg_new:nn { key~identifiers~deprecated }
- {
- The~key~'identifiers'~in~the~command~\token_to_str:N PitonOptions\
- is~now~deprecated:~you~should~use~the~command~
- \token_to_str:N \SetPitonIdentifier\ instead.\\
- However,~you~can~go~on.
- }
-% \end{macrocode}
%
% \begin{macrocode}
\@@_msg_new:nn { Unknown~key~for~SetPitonStyle }
@@ -4840,7 +4846,7 @@ piton_version = "2.7" -- 2024/03/24
% \end{macrocode}
%
% \begin{macrocode}
-\msg_new:nnnn { piton } { Unknown~key~for~PitonOptions }
+\@@_msg_new:nnn { Unknown~key~for~PitonOptions }
{
Unknown~key. \\
The~key~'\l_keys_key_str'~is~unknown~for~\token_to_str:N \PitonOptions.~
@@ -4939,7 +4945,6 @@ piton_version = "2.7" -- 2024/03/24
require ( "piton" )
tex.sprint ( luatexbase.catcodetables.CatcodeTableExpl ,
"\\@@_test_version:n {" .. piton_version .. "}" )
-
}
}
% \end{macrocode}
@@ -5001,6 +5006,12 @@ function piton.close_brace ()
end
% \end{macrocode}
%
+% \begin{macrocode}
+local function sprintL3 ( s )
+ tex.sprint ( luatexbase.catcodetables.expl , s )
+end
+% \end{uncoverenv}
+%
% \bigskip
% \subsubsection{Special functions dealing with LPEG}
%
@@ -6624,7 +6635,7 @@ LPEG2['c'] =
% \begin{macrocode}
local function LuaKeyword ( name )
return
- Lc "{\\PitonStyle{Keyword}{"
+ Lc [[{\PitonStyle{Keyword}{]]
* Q ( Cmt (
C ( identifier ) ,
function ( s , i , a ) return string.upper ( a ) == name end
@@ -6924,26 +6935,23 @@ function piton.Parse ( language , code )
local t = LPEG2[language] : match ( code )
if t == nil
then
- tex.sprint( luatexbase.catcodetables.CatcodeTableExpl,
- [[ \@@_error:n { syntax~error } ]] )
+ sprintL3 [[ \@@_error_or_warning:n { syntax~error } ]]
return -- to exit in force the function
end
local left_stack = {}
local right_stack = {}
- for _ , one_item in ipairs ( t )
- do
- if one_item[1] == "EOL"
- then
- for _ , s in ipairs ( right_stack )
- do tex.sprint ( s )
- end
- for _ , s in ipairs ( one_item[2] )
- do tex.tprint ( s )
- end
- for _ , s in ipairs ( left_stack )
- do tex.sprint ( s )
- end
- else
+ for _ , one_item in ipairs ( t ) do
+ if one_item[1] == "EOL" then
+ for _ , s in ipairs ( right_stack ) do
+ tex.sprint ( s )
+ end
+ for _ , s in ipairs ( one_item[2] ) do
+ tex.tprint ( s )
+ end
+ for _ , s in ipairs ( left_stack ) do
+ tex.sprint ( s )
+ end
+ else
% \end{macrocode}
%
% Here is an example of an item beginning with |"Open"|.
@@ -6957,22 +6965,20 @@ function piton.Parse ( language , code )
% |\begin{uncover}<2>| and |right_stack| will be for the elements like
% |\end{cover}|.
% \begin{macrocode}
- if one_item[1] == "Open"
- then
- tex.sprint( one_item[2] )
- table.insert ( left_stack , one_item[2] )
- table.insert ( right_stack , one_item[3] )
- else
- if one_item[1] == "Close"
- then
- tex.sprint ( right_stack[#right_stack] )
- left_stack[#left_stack] = nil
- right_stack[#right_stack] = nil
- else
- tex.tprint ( one_item )
- end
- end
- end
+ if one_item[1] == "Open" then
+ tex.sprint( one_item[2] )
+ table.insert ( left_stack , one_item[2] )
+ table.insert ( right_stack , one_item[3] )
+ else
+ if one_item[1] == "Close" then
+ tex.sprint ( right_stack[#right_stack] )
+ left_stack[#left_stack] = nil
+ right_stack[#right_stack] = nil
+ else
+ tex.tprint ( one_item )
+ end
+ end
+ end
end
end
% \end{macrocode}
@@ -6981,32 +6987,39 @@ end
%
% \bigskip
% The function |ParseFile| will be used by the LaTeX command |\PitonInputFile|.
-% That function merely reads the whole file (that is to say all its lines) and
+% That function merely reads the file (between |first_line| and |last_line|) and
% then apply the function~|Parse| to the resulting Lua string.
% \begin{macrocode}
-function piton.ParseFile ( language , name , first_line , last_line )
+function piton.ParseFile ( language , name , first_line , last_line , split )
local s = ''
local i = 0
- for line in io.lines ( name )
- do i = i + 1
- if i >= first_line
- then s = s .. '\r' .. line
- end
- if i >= last_line then break end
+ for line in io.lines ( name ) do
+ i = i + 1
+ if i >= first_line then
+ s = s .. '\r' .. line
+ end
+ if i >= last_line then break end
end
% \end{macrocode}
% We extract the BOM of utf-8, if present.
% \begin{macrocode}
- if string.byte ( s , 1 ) == 13
- then if string.byte ( s , 2 ) == 239
- then if string.byte ( s , 3 ) == 187
- then if string.byte ( s , 4 ) == 191
- then s = string.sub ( s , 5 , -1 )
- end
- end
- end
+ if string.byte ( s , 1 ) == 13 then
+ if string.byte ( s , 2 ) == 239 then
+ if string.byte ( s , 3 ) == 187 then
+ if string.byte ( s , 4 ) == 191 then
+ s = string.sub ( s , 5 , -1 )
+ end
+ end
+ end
+ end
+ if split == 1 then
+ piton.GobbleSplitParse ( language , 0 , s )
+ else
+ sprintL3 [[ \bool_if:NT \g_@@_footnote_bool \savenotes \vtop \bgroup ]]
+ piton.Parse ( language , s )
+ sprintL3
+ [[\vspace{2.5pt}\egroup\bool_if:NT\g_@@_footnote_bool\endsavenotes\par]]
end
- piton.Parse ( language , s )
end
% \end{macrocode}
%
@@ -7016,9 +7029,9 @@ end
% The following command will be used by the user command |\piton|.
% For that command, we have to undo the duplication of the symbols |#|.
% \begin{macrocode}
-function piton.ParseBis ( language , code )
+function piton.ParseBis ( lang , code )
local s = ( Cs ( ( P '##' / '#' + 1 ) ^ 0 ) ) : match ( code )
- return piton.Parse ( language , s )
+ return piton.Parse ( lang , s )
end
% \end{macrocode}
%
@@ -7029,10 +7042,14 @@ end
% element. In that case, you have to remove the potential |\@@_breakable_space:|
% that have been inserted when the key |break-lines| is in force.
% \begin{macrocode}
-function piton.ParseTer ( language , code )
- local s = ( Cs ( ( P [[ \@@_breakable_space: ]] / ' ' + 1 ) ^ 0 ) )
+function piton.ParseTer ( lang , code )
+% \end{macrocode}
+% Be careful: we have to write |[[\@@_breakable_space: ]]| with a space after
+% the name of the LaTeX command |\@@_breakable_space:|.
+% \begin{macrocode}
+ local s = ( Cs ( ( P [[\@@_breakable_space: ]] / ' ' + 1 ) ^ 0 ) )
: match ( code )
- return piton.Parse ( language , s )
+ return piton.Parse ( lang , s )
end
% \end{macrocode}
%
@@ -7090,11 +7107,10 @@ local EnvGobbleLPEG =
% \begin{macrocode}
local function remove_before_cr ( input_string )
local match_result = ( P "\r" ) : match ( input_string )
- if match_result
- then
- return string.sub ( input_string , match_result )
+ if match_result then
+ return string.sub ( input_string , match_result )
else
- return input_string
+ return input_string
end
end
% \end{macrocode}
@@ -7120,16 +7136,24 @@ local function gobble ( n , code )
end
end
% \end{macrocode}
+% We have a second test |if n == 0| because the, even if the key like
+% |auto-gobble| is in force, it's possible that, in fact, there is no space to gobble...
+% \begin{macrocode}
+ if n == 0 then
+ return code
+ else
+% \end{macrocode}
% We will now use a \textsc{lpeg} that we have to compute dynamically because it
% depends on the value of~$n$.
% \begin{macrocode}
- return
- ( Ct (
- ( 1 - P "\r" ) ^ (-n) * C ( ( 1 - P "\r" ) ^ 0 )
- * ( C "\r" * ( 1 - P "\r" ) ^ (-n) * C ( ( 1 - P "\r" ) ^ 0 )
- ) ^ 0 )
- / table.concat
- ) : match ( code )
+ return
+ ( Ct (
+ ( 1 - P "\r" ) ^ (-n) * C ( ( 1 - P "\r" ) ^ 0 )
+ * ( C "\r" * ( 1 - P "\r" ) ^ (-n) * C ( ( 1 - P "\r" ) ^ 0 )
+ ) ^ 0 )
+ / table.concat
+ ) : match ( code )
+ end
end
end
% \end{macrocode}
@@ -7140,52 +7164,42 @@ end
% \bigskip
% In the following code, |n| is the value of |\l_@@_gobble_int|.
% \begin{macrocode}
-function piton.GobbleParse ( language , n , code )
+function piton.GobbleParse ( lang , n , code )
piton.last_code = gobble ( n , code )
- piton.last_language = language
+ piton.last_language = lang
% \end{macrocode}
% \begin{macrocode}
- tex.sprint(luatexbase.catcodetables.CatcodeTableExpl ,
- [[ \bool_if:NT \g_@@_footnote_bool \savenotes \vtop \bgroup ]] )
- piton.Parse ( language , piton.last_code )
- tex.sprint(luatexbase.catcodetables.CatcodeTableExpl ,
- [[ \vspace { 2.5 pt } \egroup \bool_if:NT \g_@@_footnote_bool \endsavenotes \par ]] )
+ sprintL3 [[ \bool_if:NT \g_@@_footnote_bool \savenotes \vtop \bgroup ]]
+ piton.Parse ( lang , piton.last_code )
+ sprintL3
+ [[\vspace{2.5pt}\egroup\bool_if:NT\g_@@_footnote_bool\endsavenotes\par]]
% \end{macrocode}
%
% Now, if the final user has used the key |write| to write the code of the
-% environment on an external file.
+% environment on an external file.
% \begin{macrocode}
- if piton.write ~= ''
- then local file = assert ( io.open ( piton.write , piton.write_mode ) )
- file:write ( piton.get_last_code ( ) )
- file:close ( )
+ if piton.write and piton.write ~= '' then
+ local file = assert ( io.open ( piton.write , piton.write_mode ) )
+ file:write ( piton.get_last_code ( ) )
+ file:close ( )
end
end
% \end{macrocode}
%
% \bigskip
-% The function |GobbleParsePar| is merely the function |GobbleParse| with the
-% insertion of a |\par| in the TeX flow after.
-% \begin{macrocode}
-local function GobbleParsePar ( language , n , code )
- piton.GobbleParse ( language , n , code )
- tex.sprint [[ \par ]]
-end
-% \end{macrocode}
-%
-% \bigskip
% The following function will be used when the key |split-on-empty-lines| is in
% force. With that key, the informatic code is split in chunks at the empty
% lines (usually between the informatic functions defined in the informatic
% code). LaTeX will be able to change the page between the chunks.
% \begin{macrocode}
-function piton.GobbleSplitParse ( language , n , code )
+function piton.GobbleSplitParse ( lang , n , code )
P { "E" ,
E = ( V "F"
- * ( P " " ^ 0 * "\r" ) ^ 1
+ * ( P " " ^ 0 * "\r"
+ / ( function ( x ) sprintL3 [[ \@@_incr_visual_line: ]] end )
+ ) ^ 1
/ ( function ( x )
- tex.sprint ( luatexbase.catcodetables.expl ,
- [[ \l_@@_split_separation_tl ]] )
+ sprintL3 [[ \l_@@_split_separation_tl \int_gzero:N \g_@@_line_int ]]
end )
) ^ 0 * V "F" ,
% \end{macrocode}
@@ -7193,11 +7207,11 @@ function piton.GobbleSplitParse ( language , n , code )
% \begin{macrocode}
F = C ( V "G" ^ 0 )
% \end{macrocode}
-% The second argument of |GobbleParsePar| is the argument |gobble|: we put that
-% argument to~$0$ because we will have gobbled previously the whole argument
+% The second argument of |.pitonGobbleParse| is the argument |gobble|: we put
+% that argument to~$0$ because we will have gobbled previously the whole argument
% |code| (see below).
% \begin{macrocode}
- / ( function ( x ) GobbleParsePar ( language , 0 , x ) end ) ,
+ / ( function ( x ) piton.GobbleParse ( lang , 0 , x ) end ) ,
% \end{macrocode}
% The non-terminal |G| corresponds to a non-empty line of code.
% \begin{macrocode}
@@ -7224,9 +7238,7 @@ end
function piton.CountLines ( code )
local count = 0
for i in code : gmatch ( "\r" ) do count = count + 1 end
- tex.sprint (
- luatexbase.catcodetables.expl ,
- [[ \int_set:Nn \l_@@_nb_lines_int { ]] .. count .. '}' )
+ sprintL3 ( [[ \int_set:Nn \l_@@_nb_lines_int { ]] .. count .. '}' )
end
% \end{macrocode}
%
@@ -7240,9 +7252,7 @@ function piton.CountNonEmptyLines ( code )
* -1
) / table.getn
) : match ( code )
- tex.sprint(
- luatexbase.catcodetables.expl ,
- [[ \int_set:Nn \l_@@_nb_non_empty_lines_int { ]] .. count .. '}' )
+ sprintL3 ( [[ \int_set:Nn \l_@@_nb_non_empty_lines_int { ]] .. count .. '}' )
end
% \end{macrocode}
%
@@ -7250,11 +7260,8 @@ end
% \begin{macrocode}
function piton.CountLinesFile ( name )
local count = 0
- io.open ( name )
for line in io.lines ( name ) do count = count + 1 end
- tex.sprint (
- luatexbase.catcodetables.expl ,
- [[ \int_set:Nn \l_@@_nb_lines_int { ]] .. count .. '}' )
+ sprintL3 ( [[ \int_set:Nn \l_@@_nb_lines_int { ]] .. count .. '}' )
end
% \end{macrocode}
%
@@ -7264,13 +7271,11 @@ end
function piton.CountNonEmptyLinesFile ( name )
local count = 0
for line in io.lines ( name )
- do if not ( ( P " " ^ 0 * -1 ) : match ( line ) )
- then count = count + 1
+ do if not ( ( P " " ^ 0 * -1 ) : match ( line ) ) then
+ count = count + 1
end
end
- tex.sprint (
- luatexbase.catcodetables.expl ,
- [[ \int_set:Nn \l_@@_nb_non_empty_lines_int { ]] .. count .. '}' )
+ sprintL3 ( [[ \int_set:Nn \l_@@_nb_non_empty_lines_int { ]] .. count .. '}' )
end
% \end{macrocode}
%
@@ -7299,15 +7304,12 @@ function piton.ComputeRange(marker_beginning,marker_end,file_name)
count = count + 1
end
if first_line == -1
- then tex.sprint ( luatexbase.catcodetables.expl ,
- [[ \@@_error:n { begin~marker~not~found } ]] )
+ then sprintL3 [[ \@@_error_or_warning:n { begin~marker~not~found } ]]
else if last_found == false
- then tex.sprint ( luatexbase.catcodetables.expl ,
- [[ \@@_error:n { end~marker~not~found } ]] )
+ then sprintL3 [[ \@@_error_or_warning:n { end~marker~not~found } ]]
end
end
- tex.sprint (
- luatexbase.catcodetables.expl ,
+ sprintL3 (
[[ \int_set:Nn \l_@@_first_line_int { ]] .. first_line .. ' + 2 }'
.. [[ \int_set:Nn \l_@@_last_line_int { ]] .. count .. ' }' )
end