标题包含问题:我有一张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
而不必使用单独的命令。