我觉得这应该非常简单,但即使使用多个其他 SE 解决方案,我仍无法弄清楚。
我想传递一个类似于Evans1963
我定义的命令的参数:
\newcommand{\placefigure}[1]{
\begin{wrapfigure}{O}{0.47\textwidth}
\centering
\includegraphics[width=0.45\textwidth]{\MakeLowercase{#1}_results}
\caption{\citeauthor{#1} study results}
\label{fig:#1_results}
\end{wrapfigure}
}
\MakeLowercase
我需要在调用中使用\includegraphics
,因为即使我的引用键采用了该Evans1963
格式(我稍后用 调用cite
),但我的数字仍保存在该evans1963
格式中。
然后我就可以打电话:
\placefigure{Evans1963}
这样我的图像就会被包含在内并且引用也会正确起作用。
但是,我收到了错误:
Missing input file '\MakeLowercase {Evans1963}_results'
答案1
非常抱歉,我无法非常优雅地解决您的问题,我认为下面的代码应该可以让您的项目正常工作:
\ExplSyntaxOn
\cs_set_eq:NN \Lowercase \str_lowercase:n
\ExplSyntaxOff
\newcommand{\placefigure}[1]{
\begin{wrapfigure}{O}{0.47\textwidth}
\centering
\includegraphics[width=0.45\textwidth]{\Lowercase{#1}_results}
\caption{\citeauthor{#1} study results}
\label{fig:#1_results}
\end{wrapfigure}
}
我猜你的问题就在这里
\includegraphics{\MakeLowercase{#1}_results}
一开始我以为是宏展开顺序的问题:于是,我尝试了如下方法
\expandafter\includegraphics\expandafter{\MakeLowercase{#1}_results}
它仍然不起作用,宏\MakeLowercase
没有扩展?
我尝试:
\def\a{evans1963_results}
\includegraphics{\a}
这是正常的!抱歉我没有找到更可行的方法,或者我没有弄清楚原因,希望有人能解释一下!
答案2
LaTeX宏\Makelowercase
使用\lowercase
TeX 原语,此命令不能用作表示文件名的参数。此参数仅被扩展,但\lowercase
无法在此处处理类似命令。
但你的问题的解决方案很简单。你可以\lowercase
先执行,然后\incudegraphics
调用。相反:
\includegraphics[width=0.45\textwidth]{\lowercase{#1}_results}
使用
\lowercase{\includegraphics[width=0.45\textwidth]{#1_results}}
我们利用单词width
和results
已经是小写的优势,它们不需要改变。
答案3
如果\includegraphics
' 可选参数包含不应小写的内容和/或文件名的某些部分不应小写,则可以使用宏来组成对\includegraphics
多个参数的调用,其中第一个参数包含应小写的内容:
\documentclass{article}
\begin{filecontents*}{\jobname.bib}
@book{Evans1963,
author = "Ex and Amp and Le",
title = "Example book",
year = "1234",
publisher = "Example's publisher",
address = "Address of Example's publisher"
}
\end{filecontents*}
\usepackage{graphicx, wrapfig}
\usepackage[round,sort,authoryear]{natbib}
\newcommand\PassFirstAndSecondToThird[3]{#3{#1#2}}
\newcommand{\placefigure}[1]{%
\begin{wrapfigure}{O}{0.47\textwidth}%
\centering
\lowercase{\PassFirstAndSecondToThird{#1}}{_results}{%
\includegraphics[width=0.45\textwidth]%
}%
\caption{\citeauthor{#1} study results}%
\label{fig:#1_results}%
\end{wrapfigure}%
}
\begin{document}
\placefigure{Evans1963}
Text.
\newpage
\bibliographystyle{authordate1}
\bibliography{\jobname}
\end{document}
如果你坚持使用,\MakeLowercase
你需要应用一些粗略的括号破解,以便从由以下方式产生的额外括号中得到东西\MakeLowercase
——但不建议这么做因为\MakeLowercase
可能会插入生成字体字形而不是字符的命令,除此之外,在具有 utf8 编码的 .tex 输入文件的 8 位引擎上,您可能对 ASCII 范围之外的 utf8 字符的处理不满意——您最好使用expl3's \str_lowercase:n
。
\documentclass{article}
\begin{filecontents*}{\jobname.bib}
@book{Evans1963,
author = "Ex and Amp and Le",
title = "Example book",
year = "1234",
publisher = "Example's publisher",
address = "Address of Example's publisher"
}
\end{filecontents*}
\usepackage{graphicx, wrapfig}
\usepackage[round,sort,authoryear]{natbib}
\makeatletter
\newcommand\PassFirstAndSecondToThird[3]{#3{#1#2}}
\newcommand{\placefigure}[1]{%
\begin{wrapfigure}{O}{0.47\textwidth}%
\centering
\MakeLowercase{%
\unexpanded{%
\expandafter\@gobble\string{}%
\expandafter\expandafter\expandafter\@firstofone
\expandafter\expandafter\expandafter{%
\expandafter\@gobble\string}%
\PassFirstAndSecondToThird
}%
{#1}%
}{_results}{%
\includegraphics[width=0.45\textwidth]%
}%
\caption{\citeauthor{#1} study results}%
\label{fig:#1_results}%
\end{wrapfigure}%
}%
\makeatother
\begin{document}
\placefigure{Evans1963}
Text.
\newpage
\bibliographystyle{authordate1}
\bibliography{\jobname}
\end{document}