下面的代码\percentifier
确保我们可以将例如中文字符输入到 eg 的第一个参数中\href
,方法是使用以下方法将字符串转换为其百分比编码:url_encode
(如需进一步参考,另请参阅这个答案致 OP”如何将环境中的中文字符串参数附加到 \href 的第一个参数“)。
\percentifier
:
\makeatletter
\directlua{function url_encode(str)
if (str) then
str = string.gsub (str, "\string\n", "\string\r\string\n")
str = string.gsub (str, "([^\@percentchar w \@percentchar -\@percentchar _\@percentchar .\@percentchar \string~])",
function (c) return string.format ("\@percentchar \@percentchar \@percentchar 02X", string.byte(c)) end)
str = string.gsub (str, " ", "+")
end
return str
end}
\makeatother
%
\def\percentifier#1{\directlua{
tex.print(url_encode('\detokenize{#1}'))
}}
\href
:
\href{http://a.beautiful.url/?searchid=\percentifier{#1}}{Link}%
我们代码的另一个组成部分是mainentry
-environment。假设我们的答案中需要这样的环境。实际上,这个环境将有多个参数,但当然,我为了平均能量损失。其第一个参数将始终用于完成 URL:
mainentry
-环境:
\newenvironment {mainentry}
{\mainentryA}
%
{\clearpage}
%
\def\mainentryA#1{%
#1 \href{http://a.beautiful.url/?searchid=\percentifier{#1}}{Link}%
}{
}
在里面平均能量损失下面,请注意代码对于 运行完美Test1
(因为它被呈现为Test1%
。但是,代码对于 运行不佳Test2
(因为 Tex 解释了它后面的尾随空格,这是由于url_encode
添加了+
)。
现在,我的目的不是改变将空格更改为 的行为+
,这是为了使 正常运行url_encode
。不过,我不希望 Tex 将 的实例解释Test2
为带有尾随空格。因此,也许可以在 的定义中解决该问题\percentifier
,或者如果不能:在 的定义中\mainentryA
。
请注意,我不想使用解决方案 1 或解决方案 2这个答案另一篇题为“为什么此代码对某些用户输出可点击的 URL,而对其他用户却不输出?“。
我宁愿有一个类似的解决方案这个答案。使用\cs_set_eq:NN\Trim\tl_trim_spaces:n
或类似构造的东西。不知何故,我一直无法这样做。
平均能量损失
\documentclass[a4paper]{article}
\usepackage{hyperref}
%%%%%%%
% \percentifier
\makeatletter
\directlua{function url_encode(str)
if (str) then
str = string.gsub (str, "\string\n", "\string\r\string\n")
str = string.gsub (str, "([^\@percentchar w \@percentchar -\@percentchar _\@percentchar .\@percentchar \string~])",
function (c) return string.format ("\@percentchar \@percentchar \@percentchar 02X", string.byte(c)) end)
str = string.gsub (str, " ", "+")
end
return str
end}
\makeatother
%
\def\percentifier#1{\directlua{
tex.print(url_encode('\detokenize{#1}'))
}}
%
%%%%%%%
%%%%%%%
% \mainentry
\newenvironment {mainentry}
{\mainentryA}
%
{\clearpage}
%
\def\mainentryA#1{%
#1 \href{http://a.beautiful.url/?searchid=\percentifier{#1}}{Link}%
}{
}
%
%%%%%%%
\begin{document}
\begin{mainentry}{%
Test1%
}
\end{mainentry}
\begin{mainentry}{%
Test2
}
\end{mainentry}
\end{document}
答案1
要从参数中删除尾随空格,可以使用\stripspace
以下两行定义的宏:
\def\stripspace#1#2{\stripspaceA#2\end/ \end/\relax#1{#2}}
\def\stripspaceA#1 \end/#2\relax#3#4{\if\relax#2\relax#3{#4}\else#3{#1}\fi}
\def\percentifier#1{[#1]} % just for testing
\stripspace\percentifier {text1 and text}
\stripspace\percentifier {text2 and text }
without stripping: \percentifier{text3 and text }
\bye
这是完全可扩展的解决方案。
在您的应用程序中您可以替换
\href{http://a.beautiful.url/?searchid=\percentifier{#1}}{Link}%
经过
\href{http://a.beautiful.url/?searchid=\stripspace\percentifier{#1}}{Link}%