pgfkey 상속 중

pgfkey 상속 중

저는 LaTeX 명령을 포함하는 MatLab-LaTeX "인터페이스"를 작성 중입니다 \data[options]{tag}. tag.csv 파일에서 명명된 값을 읽어서 .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}

관련 정보