我正在尝试从文件中读取 URL 列表并为其创建二维码。如果它们包含#
示例中的“like”,我会得到一个
\qr@texttoencode 定义中的参数编号非法
错误。是否可以在不编辑输入文件并转义其中的特殊字符的情况下完成此操作?
\documentclass{article}
\usepackage{qrcode}
\begin{filecontents*}{urls.txt}
http://example.org/foo#bar
\end{filecontents*}
\def\loadurls#1{%
\newread\file
\openin\file=#1
\begingroup\endlinechar=-1
\loop\unless\ifeof\file
\read\file to \fileline
\qrcode{\fileline}
\repeat
\endgroup
\closein\file
}
\begin{document}
\loadurls{urls.txt}
\end{document}
答案1
另一种解决方案是使用csvsimple
。请查看3.6 特殊字符文档中csvsimple
提供了其他选项来转义特殊字符。在这里,我使用respect sharp=true
# 将 # 解释为普通字符:
\documentclass{article}
\usepackage{csvsimple}
\usepackage{qrcode}
\begin{filecontents}[overwrite,noheader]{urls.txt}
http://example.org/foo#bar
http://www.ctan.org
\end{filecontents}
\begin{document}
\csvreader[nohead,respect sharp=true]{urls.txt}{}{\qrcode{\csvcoli}\quad}
\end{document}
答案2
您应该使用\readstring
而不是\read
。顺便说一句,\newread
应该超出 的定义\loadurls
(并且您应该使用与 不同的名称\file
)。
这是一个expl3
版本:
\begin{filecontents*}[overwrite]{\jobname.dat}
http://example.org/foo#bar
https://tex.stackexchange.com/questions/594413/special-characters-in-qr-code#594426
\end{filecontents*}
\documentclass{article}
\usepackage{qrcode}
\ExplSyntaxOn
\NewDocumentCommand{\loadurls}{m}
{
\patheticpat_loadurls:n { #1 }
}
\ior_new:N \g_patheticpat_loadurls_ior
\cs_new_protected:Nn \patheticpat_loadurls:n
{
\ior_open:Nn \g_patheticpat_loadurls_ior { #1 }
\ior_str_map_inline:Nn \g_patheticpat_loadurls_ior
{
\qrcode{##1}\par\medskip
}
}
\ExplSyntaxOff
\begin{document}
\loadurls{\jobname.dat}
\end{document}