您好,我想比較兩個逗號分隔的清單。
\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}