Datatool、UTF8 和导出到文件

Datatool、UTF8 和导出到文件

标题包含问题:我有一张datatool表格,其中包含重音字符(öäü),我想将该表格导出到 CSV 文件中:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{datatool}

\begin{document}
\DTLnewdb{table}
\DTLnewrow{table}
\DTLnewdbentry{table}{name}{aouäöü}


\DTLdisplaydb{table}
\DTLsavedb{table}{export.csv}

\end{document}

使用这个包之后inputenc,表格的显示就可以了:

name
aouäöü

但是在创建的文件中export.csv有:

name
aou\IeC {\"a}\IeC {\"o}\IeC {\"u}

对我来说最好的是,如果导出的文件是 UTF8 编码(而不是 Ascii),并且包含aouäöü。我可以接受的第二类解决方案是,如果导出的文件包含

aou\"a\"o\"u

我还可以接受一个作为参数并返回的宏\convertöäü\"a\"o\"u我不知道它是否存在。

答案1

您可以\"a通过重新定义来获取版本\IeC

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{datatool}

\begin{document}
\DTLnewdb{table}
\DTLnewrow{table}
\DTLnewdbentry{table}{name}{aouäöü}


\DTLdisplaydb{table}
\def\IeC#1{#1}
\DTLsavedb{table}{export.csv}

\end{document}

对于真正的 UTF8,您可以尝试这样的操作:完成(!)(第一个条目是 128,最后一个是 255,第二个参数包含十六进制数字),然后将其保存为identity.def

\ProvidesFile{identity.def}
   [2012/02/23 v1.0 Input encoding file]
\makeatletter
\DeclareInputText{128}{\string^^80}
%....
\DeclareInputText{164}{\string^^a4}
%....
\DeclareInputText{182}{\string^^b6}
%....
\DeclareInputText{188}{\string^^bc}
%....
\DeclareInputText{195}{\string^^c3}
% ...
\DeclareInputText{228}{\string^^e4}
%...
\DeclareInputText{246}{\string^^f6}
%...
\DeclareInputText{252}{\string^^fc}
%...
\makeatother
\endinput

然后这个(我希望没有副作用 ;-))应该给你 UTF8 导出(如果主文档是 UTF8 编码的。如果它在例如 ansinew 中,则导出也将是 ansinew):

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{datatool}

\begin{document}
\DTLnewdb{table}
\DTLnewrow{table}
\DTLnewdbentry{table}{name}{aouäöü}


\DTLdisplaydb{table}

{\inputencoding{identity}
\DTLsavedb{table}{export.csv}
}

öäü
\end{document}

答案2

补丁可能完成\"a版本是

\usepackage{etoolbox}
\makeatletter
\patchcmd{\DTLsavedb}
  {\protected@write\@dtl@write{}{\@dtl@row}}
  {{\let\IeC\@firstofone\protected@write\@dtl@write{}{\@dtl@row}}}
  {}{}
\makeatother

但对于其他重音字符,这可能会失败。问题在于如何\@dtl@row定义(使用\protected@edef)以及在 LaTeX 中实现 UTF-8 支持,这保证了 LaTeX 的正确写入,但对于像您这样的其他目的,这并不是人们可以期望的。

编辑:扩展 Ulrike 的想法,这是一个应该是安全的版本。

此代码应放在序言中

\makeatletter
\newcommand{\DTLsavedbutf}[2]{%
  \begingroup\count@=127
  \loop\ifnum\count@<\@cclv
    \advance\count@\@ne
    \begingroup\lccode`!=\count@
    \lowercase{\endgroup
      \expandafter\DeclareInputText\expandafter{\number\count@}{\string!}}
  \repeat
  \DTLsavedb{#1}{#2}\endgroup}
\makeatother

然后命令\DTLsavedbutf将写入所有字符(设置高位),而不进行任何特殊解释。

如果你想将其应用于每一个 \DTLsavedb命令,那么代码应该重新定义该命令:

\makeatletter
\let\original@DTLsavedb\DTLsavedb
\renewcommand{\DTLsavedb}[2]{%
  \begingroup\count@=127
  \loop\ifnum\count@<\@cclv
    \advance\count@\@ne
    \begingroup\lccode`!=\count@
    \lowercase{\endgroup
      \expandafter\DeclareInputText\expandafter{\number\count@}{\string!}}
  \repeat
  \original@DTLsavedb{#1}{#2}\endgroup}
\makeatother

这样您就可以使用\DTLsavedb而不必使用单独的命令。

相关内容