
Я пишу "интерфейс" MatLab-LaTeX, который включает команду LaTeX \data[options]{tag}
. Она считывает указанное значение tag
из файла .csv и выводит его через siunitx
.
Я хочу, чтобы пользователь мог вызвать команду с помощью клавиши, filename
чтобы выбрать файл .csv (по умолчанию «data.csv»), и передать любые другие параметры в siunitx
, желательно со значениями по умолчанию.
Сейчас работает жесткое кодирование в нескольких вариантах, но это не дает мне никакого контроля над документом.
Мой код выглядит следующим образом:
% datax.sty
\ProvidesPackage{datax}
\RequirePackage{csvsimple}
\RequirePackage{siunitx}
\RequirePackage{pgfkeys}
\makeatletter
\pgfqkeys{/data}%
{filename/.estore in = \@filename,%
filename/.default = data.csv%
}
\newcommand{\data}[2][]{%
\pgfqkeys{/siunitx}{/remainingkeys/.style={}}%
\pgfqkeys{/data}{filename}%
\pgfqkeys{/data}{#1}%
\csvreader[filter strcmp={\@datatag}{#2}]%
{\@filename}{1=\@datatag,2=\@datavalue,3=\@dataunit}%
{%
\SI[round-mode=figures,round-precision=3,scientific-notation=true] {\@datavalue}{\@dataunit}%
}%
}
\makeatother
,
% Inside document
The length was measured to \data[filename=newdata.csv,scientific-notation=false]{length}.
и
% newdata.csv
tag,value,unit
length,23.45,\meter
решение1
Вот решение:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.csv}
tag,value,unit
length,23.45,m
\end{filecontents*}
% pseudo package 'datax'
\makeatletter
\RequirePackage{csvsimple}
\RequirePackage{siunitx}
\RequirePackage{pgfkeys}
\pgfkeys{/datax/.is family}
\def\dataxkeys#1{\pgfkeys{/datax,#1}}
\dataxkeys{
filename/.estore in=\datax@filename,
siunitx options/.store in=\datax@siunitxoptions,
% defaults values,
filename=data.csv,
siunitx options=,
}
\newcommand{\data}[2][]{%
\dataxkeys{#1}%
\csvreader[filter strcmp={\datax@tag}{#2}]%
{\datax@filename}{1=\datax@tag,2=\datax@value,3=\datax@unit}
{%
\bgroup% to keep \sisetup change local
\sisetup{round-mode=figures,round-precision=3,scientific-notation=true}%
\expandafter\SI\expandafter[\datax@siunitxoptions]%
{\datax@value}{\datax@unit}%
\egroup%
}%
}
\makeatother
% end of pseudo package 'datax'
\begin{document}
The length was measured to
\data[filename=\jobname.csv,
siunitx options={scientific-notation=false},
]{length}.
The length was measured to
\data[filename=\jobname.csv,
siunitx options={round-precision=2},
]{length}.
\end{document}