\NeedsTeXFormat{LaTeX2e}
\ProvidesExplPackage
{markdownthemewitiko_expltools_explcheck_warnings-and-errors}%
{2025-06-19}%
{0.0.6}%
{Snippets for typesetting the documentation of the warnings and errors for %
the expl3 analysis tool}
\int_new:N
\g__expltools_explcheck_subsection_int
\tl_new:N
\g__expltools_explcheck_subsection_tl
\tl_new:N
\l__expltools_explcheck_current_label_tl
\tl_new:N
\l__expltools_explcheck_current_identifier_tl
\bool_new:N
\l__expltools_explcheck_work_in_progress_bool
\prop_new:N
\g__expltools_explcheck_labels_prop
\RequirePackage
{ xcolor }
\cs_new:Nn
\__expltools_explcheck_increment_counters:
{
\int_gincr:N
\g__expltools_explcheck_subsection_int
\int_compare:nTF
{ \g__expltools_explcheck_subsection_int < 10 }
{
\tl_gset:Nn
\g__expltools_explcheck_subsection_tl
{ 0 }
\tl_gput_right:NV
\g__expltools_explcheck_subsection_tl
\g__expltools_explcheck_subsection_int
}
{
\tl_gset:NV
\g__expltools_explcheck_subsection_tl
\g__expltools_explcheck_subsection_int
}
\tl_if_empty:NF
\l__expltools_explcheck_current_identifier_tl
{
\prop_gput:NVV
\g__expltools_explcheck_labels_prop
\l__expltools_explcheck_current_identifier_tl
\l__expltools_explcheck_current_label_tl
\exp_args:NV
\label
\l__expltools_explcheck_current_identifier_tl
}
\bool_if:NTF
\l__expltools_explcheck_work_in_progress_bool
{
\tl_set:NV
\l_tmpa_tl
\l__expltools_explcheck_current_label_tl
\tl_put_right:Nn
\l_tmpa_tl
{
@
\textcolor
{ gray }
}
\tl_put_right:Nx
\l_tmpa_tl
{
{ \l__expltools_explcheck_current_label_tl }
}
\exp_args:NV
\index
\l_tmpa_tl
}
{
\exp_args:NV
\index
\l__expltools_explcheck_current_label_tl
}
}
\color_set:nnn
{ __expltools_explcheck_gray }
{ gray }
{ 0.5 }
\cs_new:Nn
\__expltools_explcheck_display_heading:Nn
{
\bool_if:NTF
\l__expltools_explcheck_work_in_progress_bool
{
#1
{
\textcolor
{ gray }
{ #2 }
}
\markdownSetup
{
renderers = {
headerAttributeContextEnd += {
\color_select:n
{ __expltools_explcheck_gray }
\usemintedstyle { bw }
},
}
}
}
{
#1
{ #2 }
}
\__expltools_explcheck_increment_counters:
}
\cs_generate_variant:Nn
\__expltools_explcheck_display_heading:Nn
{ NV }
\markdownSetupSnippet
{ body }
{
citations,
content_blocks,
definition_lists,
fenced_code,
notes,
header_attributes,
html,
raw_attribute,
relative_references,
renderers = {
underscore = {
\discretionary
{ _ \textnormal { - } }
{ }
{ _ }
},
link = {
\tl_set:Nn
\l_tmpa_tl
{ #3 }
\tl_set:Nx
\l_tmpb_tl
{
\tl_range:Nnn
\l_tmpa_tl
{ 1 }
{ 1 }
}
\str_if_eq:NNT
\l_tmpb_tl
\c_hash_str
{
\tl_set:Nx
\l_tmpb_tl
{
\tl_range:Nnn
\l_tmpa_tl
{ 2 }
{ -1 }
}
\tl_set:Nn
\l_tmpa_tl
{ \hyperref [ }
\tl_put_right:NV
\l_tmpa_tl
\l_tmpb_tl
\tl_put_right:Nn
\l_tmpa_tl
{ ] }
\prop_get:NVNTF
\g__expltools_explcheck_labels_prop
\l_tmpb_tl
\l_tmpb_tl
{
\tl_put_right:Nx
\l_tmpa_tl
{ { \l_tmpb_tl } }
}
{
\msg_error:nnV
{ expltools / explcheck }
{ unknown-referenced-label }
\l_tmpb_tl
}
\tl_use:N
\l_tmpa_tl
}
},
headingOne = {
\section { #1 }
\int_gset:Nn
\g__expltools_explcheck_subsection_int
{ 0 }
\tl_gset:Nn
\g__expltools_explcheck_subsection_tl
{ 00 }
},
headerAttributeContextBegin = {
\group_begin:
\bool_set_true:N
\l__expltools_explcheck_work_in_progress_bool
\markdownSetup
{
renderers = {
attributeIdentifier = {
\tl_set:Nn
\l__expltools_explcheck_current_identifier_tl
{ ##1 }
},
attributeKeyValue = {
\str_if_eq:nnT
{ ##1 }
{ label }
{
\bool_set_false:N
\l__expltools_explcheck_work_in_progress_bool
\tl_set:Nx
\l_tmpa_tl
{ \str_uppercase:n { ##2 } }
\str_if_eq:VVF
\l_tmpa_tl
\l__expltools_explcheck_current_label_tl
{
\tl_set:Nx
\l_tmpb_tl
{ \tl_tail:V \l_tmpa_tl }
% If the provided label is out-of-order, check whether
% it had already been used.
\bool_if:nTF
{
\int_compare_p:nNn
{ \thesection }
=
{ \tl_head:V \l_tmpb_tl } &&
\int_compare_p:nNn
{ \g__expltools_explcheck_subsection_int }
<
{ \tl_tail:V \l_tmpb_tl }
}
{
% If not, skip any intermediate labels and use it.
\int_gset:Nn
\g__expltools_explcheck_subsection_int
{ \tl_tail:V \l_tmpb_tl }
\tl_set:NV
\l__expltools_explcheck_current_label_tl
\l_tmpa_tl
}
{
% Otherwise, raise an error.
\msg_error:nnVV
{ expltools / explcheck }
{ unexpected-label }
\l_tmpa_tl
\l__expltools_explcheck_current_label_tl
}
}
}
\str_if_eq:nnT
{ ##1 }
{ removed }
{
% Remove the rest of this section from the output.
\markdownSetup
{
renderers = {
heading(Two|Tree) = {
\__expltools_explcheck_increment_counters:
},
headerAttributeContextEnd += {
\cs_set:Npn
\next
########1 \markdownRendererSectionEnd
{
\markdownRendererSectionEnd
}
\next
},
},
}
}
},
attributeClassName = {
\tl_set:Nx
\l__expltools_explcheck_current_label_tl
{
\str_uppercase:n { ##1 }
\thesection
\g__expltools_explcheck_subsection_tl
}
\markdownSetup
{
renderers = {
headingTwo = {
\tl_set:Nn
\l_tmpa_tl
{ ####1~[ }
\tl_put_right:NV
\l_tmpa_tl
\l__expltools_explcheck_current_label_tl
\tl_put_right:Nn
\l_tmpa_tl
{ ] }
\__expltools_explcheck_display_heading:NV
\subsection
\l_tmpa_tl
},
headingThree = {
\tl_set:Nn
\l_tmpa_tl
{ ####1~[ }
\tl_put_right:NV
\l_tmpa_tl
\l__expltools_explcheck_current_label_tl
\tl_put_right:Nn
\l_tmpa_tl
{ ] }
\__expltools_explcheck_display_heading:NV
\subsubsection
\l_tmpa_tl
},
},
}
}
},
}
},
headerAttributeContextEnd = {
\group_end:
},
sectionBegin = {
\group_begin:
\color_group_begin:
},
sectionEnd = {
\color_group_end:
\group_end:
},
contentBlock = {
\str_case:nnF
{ #1 }
{
{ tex }
{
\markdownRendererInputFencedCode
{ #3 }
{ tex }
{ tex }
}
}
{
\markdownInput
{ #3 }
}
},
},
}
\msg_new:nnn
{ expltools / explcheck }
{ unexpected-label }
{ Expected~section~label~"#1",~but~"#2"~was~generated }
\msg_new:nnn
{ expltools / explcheck }
{ unknown-referenced-label }
{ Referenced~section~label~"#1"~does~not~exist~or~is~a~forward-reference }