如何维护要实施和记录的数据(在个人包中)

如何维护要实施和记录的数据(在个人包中)

我正在寻找最佳策略,以便在个人包中维护必须在实施中定义并记录在文档中的(长)数据列表。

让我更明确地说明以下用例:在这个个人包中,我定义了一些必须翻译成法语或英语的表达方式。为此,我利用该translator包,并创建具有相同键和相应翻译的法语和英语词典:

法文字典:

\ProvidesDictionary {mypackage}{French}
\deftranslation {abstract}{Résumé}
\deftranslation {draft}{Brouillon}

英语词典:

\ProvidesDictionary {mypackage}{English}
\deftranslation {abstract}{Abstract}
\deftranslation {draft}{Draft}

我希望这些翻译出现在包的文档中,例如作为显示法语和英语之间对应关系的表格,如下所示:

| Label    | FrenchValue | EnglishValue |
|----------+-------------+--------------|
| abstract | Résumé      | Abstract     |
| draft    | Brouillon   | Draft        |

我可以通过以下方式实现此目的:

% \iffalse meta-comment
%<*internal>
\def\nameofplainTeX{plain}
\ifx\fmtname\nameofplainTeX\else
  \expandafter\begingroup
\fi
%</internal>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse
\generate{
  \file{\jobname.sty}{\from{\jobname.dtx}{package}}
  \file{French.dict}{\from{\jobname.dtx}{French-dict}}
  \file{English.dict}{\from{\jobname.dtx}{English-dict}}
}
%</install>
%<install>\endbatchfile
%<*internal>
\generate{
  \file{\jobname.ins}{\from{\jobname.dtx}{install}}
}
\ifx\fmtname\nameofplainTeX
  \expandafter\endbatchfile
\else
  \expandafter\endgroup
\fi
%</internal>
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{\jobname}
%</package>
%<*driver>
\documentclass{ltxdoc}
\usepackage{fontspec}
\usepackage{\jobname}
\begin{document}
  \DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
% \section{Dictionaries}
%
% Translations are summarized in Table~\ref{tab:translations}.
% \begin{table}[hb]
%   \centering
%   \begin{tabular}{lll}
%     Label    & French Value & English Value \\\hline
%     abstract & Résumé       & Abstract      \\
%     draft    & Brouillon    & Draft
%   \end{tabular}
%   \caption{Translations}
%   \label{tab:translations}
% \end{table}
%
%\StopEventually{}
%
% \subsection{French dictionary}
%
%    \begin{macrocode}
%<*French-dict>
%    \end{macrocode}
%
% \begin{description}
% \item[Identification:]
%    \begin{macrocode}
\ProvidesDictionary{\jobname}{French}
%    \end{macrocode}
% \item[Translations:]
%    \begin{macrocode}
\deftranslation{abstract}{Résumé}
\deftranslation{draft}{Brouillon}
%    \end{macrocode}
% \end{description}
%
%    \begin{macrocode}
%</French-dict>
%    \end{macrocode}
%
% \subsection{English dictionary}
%
%    \begin{macrocode}
%<*English-dict>
%    \end{macrocode}
%
% \begin{description}
% \item[Identification:]
%    \begin{macrocode}
\ProvidesDictionary{\jobname}{English}
%    \end{macrocode}
% \item[Translations:]
%    \begin{macrocode}
\deftranslation{abstract}{Abstract}
\deftranslation{draft}{Draft}
%    \end{macrocode}
% \end{description}
%
%    \begin{macrocode}
%</English-dict>
%    \end{macrocode}
%
% \Finale

问题是,如果翻译列表很长,维护起来就不容易。因此,我正在寻找一种策略,可以只输入一个数据(翻译),例如作为一个.csv文件,并且能够同时:

  • 用正确的语法定义它们translator
  • 将它们记录下来,例如作为表格。

在以下 MCE 中,我能够通过以下方式执行此操作:

  1. docstrip的宏\generate允许我创建一个.csv包含数据的文件,
  2. \newwrite、、、TeX宏允许我在外部法语和英语词典文件中写入内容\immediate\openout\write
  3. csvtools允许我将文件循环到的包.csv
    • 填充外部法语和英语词典文件,
    • 一次性创建一个显示.csv文件内容的表格,

但我不知道这是否是最好的做法。

% \iffalse meta-comment
%<*internal>
\def\nameofplainTeX{plain}
\ifx\fmtname\nameofplainTeX\else
  \expandafter\begingroup
\fi
%</internal>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse
\generate{
  \file{\jobname.sty}{\from{\jobname.dtx}{package}}
  \nopreamble\nopostamble
  \file{translations.csv}{\from{\jobname.dtx}{translations}}
}
%</install>
%<install>\endbatchfile
%<*internal>
\generate{
  \file{\jobname.ins}{\from{\jobname.dtx}{install}}
}
\ifx\fmtname\nameofplainTeX
  \expandafter\endbatchfile
\else
  \expandafter\endgroup
\fi
%</internal>
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{\jobname}
%</package>
%<*driver>
\documentclass{ltxdoc}
\usepackage{fontspec}
\usepackage{\jobname}
\begin{document}
  \DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
% Translations are summarized in Table~\ref{tab:translations}.
% \begin{table}[hb]
%   \centering
%   \CSVtotabular{expressions.csv}{lll}{^^A
%     Label & FrenchValue & EnglishValue\\\hline^^A
%   }{^^A
%     \insertLabel &
%     \insertFrenchValue &
%     \insertEnglishValue\\^^A
%   }{^^A
%     \insertLabel &
%     \insertFrenchValue &
%     \insertEnglishValue^^A
%   }
%   \caption{Translations}
%   \label{tab:translations}
% \end{table}
%
%\StopEventually{}
%
%    \begin{macrocode}
%<*translations>
%    \end{macrocode}
%
% Store the translations in an external, .csv, file.
%    \begin{macrocode}
Label,FrenchValue,EnglishValue
abstract,Résumé,Abstract
draft,Brouillon,Draft
%    \end{macrocode}
%
%    \begin{macrocode}
%</translations>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
% Load the csvtools package.
%    \begin{macrocode}
\RequirePackage{csvtools}
%    \end{macrocode}
%
% Prepare to write to external dictionary files.
%    \begin{macrocode}
\newwrite\frenchdict
\immediate\openout\frenchdict=French.dict
\newwrite\englishdict
\immediate\openout\englishdict=English.dict
%    \end{macrocode}
%
% Identify the dictionaries in their corresponding files.
%    \begin{macrocode}
\immediate\write\frenchdict{%
  \unexpanded{\ProvidesDictionary}{\jobname}{French}%
}%
\immediate\write\englishdict{%
  \unexpanded{\ProvidesDictionary}{\jobname}{English}%
}%
%    \end{macrocode}
%
% Use the translations.csv file to populate the dictionaries files (thanks to
% csvtools package).
%    \begin{macrocode}
\applyCSVfile{translations.csv}{%
  \immediate\write\frenchdict{%
    \unexpanded{\deftranslation}{\insertLabel}{\insertFrenchValue}%
  }%
  \immediate\write\englishdict{%
    \unexpanded{\deftranslation}{\insertLabel}{\insertEnglishValue}%
  }%
}
%    \end{macrocode}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% \Finale

相关内容