Почему этот фрагмент:
\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
исчезнет после использования.