Olá, gostaria de comparar duas listas separadas por vírgula.
\documentclass[a4paper]{article}
\usepackage{comment}
\usepackage{ifthen}
\usepackage{xargs}
\usepackage{xkeyval}
\usepackage{xfor}
\begin{document}
\dosomething{\compilation} % compilation is comma separated text coming from the terminal (pdflatex "\def\compilation{cat,vat,rat,sat} \input{myfile.tex}")
%arguments of the new command is another comma separated list I can Print this with #1
\newcommand{\chapterInput}[4][all]{%
%code to compare starts here
\newtoks\myValue
\myValue={#1}
begin{comment}
I wanted to do somthing like this
for(every elemnet in compilation)
{for(every element in myValue)
{\ifthenelse{\equal{elemnet in compilation}{every element in myValue}}
{
\chapter{#3\label{#4}}
\input{#2}
}
{\relax}
}}
end{comment}
%My approach is
\makeatletter
\@for\@myarg:=\myValue\do
{
\@for\@myVar:=\compilation\do
{
\ifthenelse
{
\equal{\@myarg}{\@myVar}
{
\chapter{#3\label{#4}} \input{#2}
}
{\relax}
}
}
}
\newcommand{\sectionInput}[4][all]{%
\section{#3\label{#4}}
\input{#2}
}
\newcommand{\subsectionInput}[4][all]{%
}
\chapterInput[rat,cat]{testChapter}{Test Chapter}{chap:testChapter}
\sectionInput[mat,sat]{testSection}{Test Section}{sect:testSection}
\subsectionInput[bat]{testSection}{A subsection on best}{subsect:testSubsection}
\subsectionInput[vat]{testSection}{This ia a subsection on grain}{subsect:testSubsection}
\end{document}
Minha abordagem não está funcionando. O que há de errado com minha abordagem? Qualquer outra solução também seria apreciada.
Responder1
Cada vez que estou lendo uma lista separada por vírgula, recebo a associação l3clist
. A sugestão abaixo usa l3clist
. Comentei o código para ver o que aconteceu.
A ideia básica é a definição do comando \LevelInput
que possui a seguinte sintaxe:
\LevelInput*{level}[comma list]{file name}{level title}{label}
A estrela e a lista de vírgulas são opcionais. Se você usar a estrela, a versão estrela do nível será usada. Com base nesta função principal que defini \sectionInput
. \chapterInput
está comentado porque não está disponível para article
.:
\NewDocumentCommand \sectionInput { s }
{
\IfBooleanTF { #1 }
{
\LevelInput*{section}
}
{
\LevelInput{section}
}
}
Sua lista de vírgulas predefinida também deve ser fornecida no código principal. Portanto, o comando \ProvideDocumentCommand
é adequado. Ele define o comando somente se for indefinido.
Após esta pequena introdução aqui o 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}