为什么是这个片段:
\newcommand{\Subject}{Skeleton}
\url{http://www.cheatsheet.jim.pm?subject=\lowercase{\Subject{}}}
渲染成这样?
http://www.cheatsheet.jim.pm?subject=\lowercase{Skeleton}
和不是预期:
http://www.cheatsheet.jim.pm?subject=skeleton
答案1
\lowercase
(和{}
)不可扩展,因此您需要更改执行顺序:
\documentclass{article}
\usepackage{url}
\newcommand{\Subject}{Skeleton}
\newcommand\lcURL[1]{%
\edef\tmp{\lowercase{\noexpand\url{http://www.cheatsheet.jim.pm?subject=#1}}}%
\tmp}
\begin{document}
\lcURL{\Subject}
\end{document}
如果需要删除空间,则需要使用扩张只有当你不想干扰时才需要\url
。幸运的是,LaTeX 有一个内置命令可以通过扩展删除空格:
\newcommand{\Subject}{Skeleton bones}
\makeatletter
\newcommand\lcURL[1]{%
\edef\tmp{\lowercase{\noexpand\url{http://www.cheatsheet.jim.pm?subject=\zap@space#1 \@empty}}}%
\tmp}
\makeatother
生产
http://www.cheatsheet.jim.pm?subject=skeletonbones
答案2
\StrSubstitute
只是为了看看在这种情况下如何使用:
\documentclass{article}
\usepackage{url,xstring}
\newcommand{\Subject}{Ske Le Ton}
\newcommand\lcURL[1]{%
\begingroup
\StrSubstitute{#1}{ }{}[\tmp]%
\edef\tmp{%
\lowercase{%
\endgroup
\noexpand\url{http://www.cheatsheet.jim.pm?subject=\tmp}%
}%
}%
\tmp
}
\begin{document}
X\lcURL{\Subject}X
X\url{http://www.cheatsheet.jim.pm?subject=skeleton}X
\end{document}
使用\begingroup
和\endgroup
我们确保的任何定义\tmp
在使用后都会消失。