2つのカンマ区切りリストを比較する

2つのカンマ区切りリストを比較する

こんにちは。2 つのコンマ区切りリストを比較したいと思います。

\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}

私のアプローチはうまくいきません。私のアプローチの何が問題なのでしょうか? 他の解決策があれば教えていただけるとありがたいです。

答え1

カンマ区切りのリストを読み取るたびに、関連付け を取得しますl3clist。以下の提案では を使用しますl3clist。何が起こるかを確認するために、コードにコメントを付けました。

\LevelInput基本的な考え方は、次の構文を持つコマンドの定義です。

\LevelInput*{level}[comma list]{file name}{level title}{label}

星とカンマのリストはオプションです。星を使用すると、レベルの星バージョンが使用されます。このメイン関数に基づいて、 . は\sectionInput.\chapterInputでは使用できないためコメント化されていますarticle

\NewDocumentCommand \sectionInput { s }
 {
  \IfBooleanTF { #1 }
   {
    \LevelInput*{section}
   }
   {
    \LevelInput{section}
   }
 }

定義済みのコンマ リストもメイン コードに提供する必要があります。そのため、コマンドが\ProvideDocumentCommand適しています。コマンドが定義されていない場合にのみ、コマンドを定義します。

この短い紹介の後は、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}

関連情報