你好,我想比较两个以逗号分隔的列表。
\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}