我正在寻找最佳策略,以便在个人包中维护必须在实施中定义并记录在文档中的(长)数据列表。
让我更明确地说明以下用例:在这个个人包中,我定义了一些必须翻译成法语或英语的表达方式。为此,我利用该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 中,我能够通过以下方式执行此操作:
docstrip
的宏\generate
允许我创建一个.csv
包含数据的文件,\newwrite
、、、TeX宏允许我在外部法语和英语词典文件中写入内容\immediate
,\openout
\write
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