An error message such as
Argument of \@caption has an extra }
usually means that a command in the argument of \caption
needs protection. In this case the command is surely \MSE
. Thus
\caption{A caption \protect\MSE{img1(illusion)}{\BilineaireA}}
might solve the problem.
However, in this particular application \protect
is not sufficient. We need something that contains the value we need, so a different road can be taken. Define a similar \MSEset
macro, that takes also an optional argument (default value \MSEresult
:
\begin{filecontents*}{data.csv}
Images,Infos,Bayer,BilineaireA,BilineaireB,TeinteA,TeinteB,ContourA,ContourB,Forme
img1(illusion),Temps (en ms),0,4,5,7,6,6,7,442
img1(illusion),Erreur MSE,152.44,34.44,34.44,24.04,24.04,24.06,25.99,32.90
img1(illusion),Erreur DeltaE,17.70,4.92,4.92,4.58,4.58,4.39,4.30,5.24
img1(illusion),Erreur PSNR (en dB),26.30,32.76,32.76,34.32,34.32,34.32,33.98,32.96
\end{filecontents*}
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{csvsimple}
\newcommand{\MSE}[2]{%
\csvreader[ head to column names,%
before filter=\ifthenelse{ \equal{\Images}{#1} }{%
\ifthenelse{ \equal{\Infos}{Erreur MSE} }{\csvfilteraccept}{\csvfilterreject}%
}{\csvfilterreject}]%
{data.csv}{}{#2}%
}
\newcommand{\MSEset}[3][\MSEresult]{%
\csvreader[ head to column names,%
before filter=\ifthenelse{ \equal{\Images}{#2} }{%
\ifthenelse{ \equal{\Infos}{Erreur MSE} }{\csvfilteraccept}{\csvfilterreject}%
}{\csvfilterreject}]%
{data.csv}{}{\xdef#1{#3}}%
}
\newbox{\remibox}
\begin{document}
\listoffigures
\begin{figure}
\centering
My Image
\MSEset{img1(illusion)}{\BilineaireA}
\caption{A caption \MSEresult}
\end{figure}
\end{document}
You set the macro before typing the \caption
and use \result
to stand for the value. You can also say
\MSEset[\MSEresultA]{img1(illusion)}{\BilineaireA}
or any control sequence you want if you need more than one of these numbers. Take care of using control sequence names that are not used elsewhere (a common prefix such as MSE
should do).
This will print the correct value also in the List of Figures, should you need it.
The \csvautotabular
macro is just intended for raw viewing of text CSV files. For everything else, you should use \csvreader
which allows full control of the content. If your file has no header, the assignment to the columns is simpy achieved by arabic numbers.
For following example sets the two columns in math mode and adds a line numbering for fun.
\documentclass{article}
\usepackage{csvsimple}
\usepackage{amssymb} % Math symbols
\usepackage{amsmath} % Math formulas
% Make csv in question
\begin{filecontents*}{example.csv}
ex1,\rho = 4e9
0,19.85
\end{filecontents*}
\begin{document}
\csvreader[no head,tabular=|l|c|c|,
table head=\hline,late after line=\\\hline]{example.csv}
{1=\one,2=\two}
{\thecsvrow & $\one$ & $\two$}%
\end{document}
Best Answer
I used
/csv/separator=semicolon
instead ofseparator=semicolon
and it worked.