我必须将正确(如 JSON 或 Javascript)转义的字符串写入文件。
我的最小例子是
\documentclass{standalone}
\begingroup
\catcode`<=1 \catcode`>=2
\catcode`{=12 \catcode`}=12
\gdef\wbgroup<{>
\gdef\wegroup<}>
\endgroup
\def\mytitle{This is a "title" for me}
\begin{document}
\newwrite\jsonwrite
\immediate\openout\jsonwrite=file.json
\immediate\write\jsonwrite{\wbgroup}
\immediate\write\jsonwrite{ title: "\mytitle"}
\immediate\write\jsonwrite{\wegroup}
\end{document}
我得到的是一个 file.json
{
title: "This is a "title" for me"
}
而我需要的是内部引号转义,如下所示
{
title: "This is a \"title\" for me"
}
我有个建议写入文件时转义引号但如果我这样做
\documentclass{standalone}
\begingroup
\catcode`<=1 \catcode`>=2
\catcode`{=12 \catcode`}=12
\gdef\wbgroup<{>
\gdef\wegroup<}>
\endgroup
\usepackage[T1]{fontenc}
\usepackage{expl3}
\ExplSyntaxOn
\newcommand{\myescapestring}[1]{
\tl_set:Nn \l_tmpa_tl {#1}
\regex_replace_all:nnN {"} {\u{c_backslash_str}"} \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\def\mytitle{This is a "title" for me}
\begin{document}
\newwrite\jsonwrite
\immediate\openout\jsonwrite=file.json
\immediate\write\jsonwrite{\wbgroup}
\immediate\write\jsonwrite{ title: "\myescapestring\mytitle"}
\immediate\write\jsonwrite{\wegroup}
\end{document}
我得到了更糟糕的结果,即
{
title: "\tl_set:Nn {This is a "title" for me}\regex_replace_all:nnN {"}{\unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {c_backslash_str\global \mathchardef \accent@spacefactor \spacefactor }\let \begingroup \endgroup \relax \let \ignorespaces \relax \accent 8 c_backslash_str\egroup \spacefactor \accent@spacefactor "}"
}
我只能使用 PDFLaTeX 而无法使用 LUATex,因为我在原始文档的其他部分使用了 PDFLaTeX 的许多功能。
所以本质上我正在寻找 PDFTeX 中 Javascript 的 stringEscape 函数。
答案1
您需要在写入之前进行转义,因为它不是一个可扩展的操作。
在不知道你想要写出什么细节的情况下,一个可能的解决方案
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\jsonwrite}{mmmm}
{% #1 = file name,
% #2 = initial part
% #3 = middle part
% #4 = final part
\nkiad_jsonwrite:nnnn { #1 } { #2 } { #3 } { #4 }
}
\iow_new:N \g__nkiad_jsonwrite_iow
\tl_new:N \l__nkiad_jsonwrite_item_tl
\cs_generate_variant:Nn \iow_now:Nn { NV }
\cs_new_protected:Nn \nkiad_jsonwrite:nnnn
{
\iow_open:Nn \g__nkiad_jsonwrite_iow { #1 }
\iow_now:Nx \g__nkiad_jsonwrite_iow { \c_left_brace_str }
\tl_set:Nx \l__nkiad_jsonwrite_item_tl { #3 }
\regex_replace_all:nnN { \" } { \cO\\ \" } \l__nkiad_jsonwrite_item_tl
\iow_now:Nx \g__nkiad_jsonwrite_iow
{
#2 % initial part
\l__nkiad_jsonwrite_item_tl % middle part
#4 % final part
}
\iow_now:Nx \g__nkiad_jsonwrite_iow { \c_right_brace_str }
\iow_close:N \g__nkiad_jsonwrite_iow
}
\ExplSyntaxOff
\def\mytitle{This is a "title" for me}
\begin{document}
\jsonwrite{\jobname.json}{ title: "}{\mytitle}{"}
\end{document}
我们需要区分需要转义的引号(包含在中的引号\mytitle
)和不需要转义的引号。