Every time I am reading comma separated list I get the association l3clist
. The suggestion below uses l3clist
. I commented the code to see what happen.
The basic idea is the definition of the command \LevelInput
which has the following syntax:
\LevelInput*{level}[comma list]{file name}{level title}{label}
The star and the comma list are optional. If you use the star the star version of the level is used. Based on this main function I defined \sectionInput
. \chapterInput
is commented because it's not available for article
.:
\NewDocumentCommand \sectionInput { s }
{
\IfBooleanTF { #1 }
{
\LevelInput*{section}
}
{
\LevelInput{section}
}
}
Your predefined comma list should be also provided in the main code. Therefor the command \ProvideDocumentCommand
is suitable. It defines the command only if it's undefined.
After this small introduction here the mwe.
\RequirePackage{filecontents}
\begin{filecontents}{examplefile.tex}
START EXAMPLE FILE
\lipsum[1]
END EXAMPLE FILE
\end{filecontents}
\documentclass{article}%
\usepackage{lipsum}%filling text
\usepackage{xparse}
\ExplSyntaxOn
% compilation is comma separated text coming %
% from the terminal (pdflatex "\def\compilation{cat,vat,rat,sat}
% \input{myfile.tex}")
% providing command is it isn't defined.
\ProvideDocumentCommand \compilation {} { cat , vat , rat , sat }
\clist_new:N \l_umar_compilation_clist
\clist_set:No \l_umar_compilation_clist { \compilation }
\bool_new:N \l_umar_listelemtequal_bool
\bool_set_false:N \l_umar_listelemtequal_bool
\NewDocumentCommand \LevelInput { s m o m m m }
{
%#1 star version
%#2 level command -- chapter/section/section/...
%#3 optinal argument
%#4 file name
%#5 level title
%#6 label command
\IfBooleanTF { #1 }
{%has star
\IfNoValueTF { #3 } % no optinal Argument
{%no optinal Argument
\umar_starinput:nnn { #2 } { #5 } { #4 }
}
{%optinal Argument
\umar_selected_starinput:nnnn { #3 } { #2 } { #5 } { #4 }
}
}
{%has no star
\IfNoValueTF { #3 }
{%no ptinal Argument
\umar_input:nnnn { #2 } { #5 } { #6 } { #4 }
}
{%optinal Argument
\umar_selected_input:nnnnn { #3 } { #2 } { #5 } { #6 } { #4 }
}
}
}
%\umar_starinput:nnn { level cmd } { level title } { file name }
\cs_new:Npn \umar_starinput:nnn #1 #2 #3
{
\use:c { #1 }* { #2 }
\input { #3 }
}
%\umar_input:nnnn { level cmd } { level title } { label } { file name }
\cs_new:Npn \umar_input:nnnn #1 #2 #3 #4
{
\use:c { #1 } { #2 } \label { #3 }
\input { #4 }
}
%\umar_selected_starinput:nnnn { list }{ level cmd } { level title }
% { file name }
\cs_new:Npn \umar_selected_starinput:nnnn #1 #2 #3 #4
{
\clist_map_inline:nn { #1 }
{
\clist_if_in:NnT \l_umar_compilation_clist { ##1 }
{ \bool_set_true:N \l_umar_listelemtequal_bool }
}
\bool_if:NTF \l_umar_listelemtequal_bool
{
\umar_starinput:nnn { #2 } { #3 } { #4 }
}
{
\msg_log:n { no~input }
}
\bool_set_false:N \l_umar_listelemtequal_bool
}
%\umar_selected_input:nnnnn { list }{ level cmd } { level title }
% { label } { file name }
\cs_new:Npn \umar_selected_input:nnnnn #1 #2 #3 #4 #5
{
\clist_map_inline:nn { #1 }
{
\clist_if_in:NnT \l_umar_compilation_clist { ##1 }
{ \bool_set_true:N \l_umar_listelemtequal_bool }
}
\bool_if:NTF \l_umar_listelemtequal_bool
{
\umar_input:nnnn { #2 } { #3 } { #4 } { #5 }
}
{
\msg_log:n { no~input }
}
\bool_set_false:N \l_umar_listelemtequal_bool
}
% not for article
%\NewDocumentCommand \chapterInput { s }
% {
% \IfBooleanTF { #1 }
% {
% \LevelInput*{chapter}
% }
% {
% \LevelInput{chapter}
% }
% }
\NewDocumentCommand \sectionInput { s }
{
\IfBooleanTF { #1 }
{
\LevelInput*{section}
}
{
\LevelInput{section}
}
}
\NewDocumentCommand \subsectionInput { s }
{
\IfBooleanTF { #1 }
{
\LevelInput*{subsection}
}
{
\LevelInput{subsection}
}
}
\ExplSyntaxOff
\begin{document}
\tableofcontents
\sectionInput{examplefile}{first section}{sec:one}
\sectionInput[cat]{examplefile}{first section with opt}{sec:two}
\subsectionInput[fish,rat]{examplefile}{first subsection with opt}{subsec:one}
\subsectionInput*{examplefile}{first subsection with star}{}
\end{document}
xstring
package? It defines many useful macros for string manipulation.