moderncv
我正在使用带有该样式的包制作我的简历classic
。
我希望使用该软件包将照片替换为我个人网站的二维码qrcode
。
\photo
我尝试用相应的命令替换该命令的参数\qrcode{...}
,但这失败并出现 LaTeX 错误消息:
\photo[64pt][0.5pt]{\qrcode[hyperlink,height=64pt]{http://www.ctan.org}}
以下MWE
说明了我正在尝试的想法:
\documentclass[11pt,a4paper,sans]{moderncv}
\moderncvstyle{classic}
\usepackage{graphicx}
\usepackage{qrcode}
\firstname{John}
\familyname{Doe}
\address{83 Fancy Avenue}{Noweheresville}{Gotham City 24061}
\phone[mobile]{123 456 7890}
\email{[email protected]}
% \photo[64pt][0.5pt]{example-image-a} % works fine
\photo[64pt][0.5pt]{\qrcode[hyperlink,height=64pt]{http://www.ctan.org}} % produces an error
\begin{document}
\makecvtitle
\end{document}
我怎样才能达到期望的目标?
更新
我现在明白,这\photo
本质上是一个包装器includegraphics
,因此需要文件路径和/或文件名作为其参数。
是否可以重新定义
\photo
以足够灵活地接受latex
命令或图形文件路径和/或文件名?除此之外,至少是否可以自动包含一个二维码图像,该图像会在命令的 URL 参数
\qrcode
更新时自动更新,即避免编译多个文档?
答案1
在类样式的代码中moderncv
,classic
您可以找到一个 if-then-else 结构,用于检查 a 是否\photo
已定义(打印它)或未定义(不执行任何操作)。我在空的案例中添加了一个新的 if-then-else 测试,以检查是否\qrphoto
定义了新命令。如果已定义,则代码会打印它,否则它不执行任何操作。
的新命令\qrphoto
是:
\NewDocumentCommand{\qrphoto}{O{64pt}O{0.4pt}m}{\def\@qrphotowidth{#1}\def\@qrphotoframewidth{#2}\def\@qrphoto{#3}}
通过此命令,我定义了所需的值\@qrphotowidth
等,以供以后使用。
现在我们可以用以下命令来修补原始命令
\patchcmd{\makecvhead}%
{%
\ifthenelse{\isundefined{\@photo}}{}%
}% code to patch
{% new code <=========================================================
\ifthenelse{\isundefined{\@photo}}%
{%
\ifthenelse{\isundefined{\@qrphoto}}%
{}%
{%
\if@left%
\hspace*{\separatorcolumnwidth}\fi%
\color{black}% <======================== to get a black qrcode
\setlength{\fboxrule}{\@qrphotoframewidth}%
\ifdim\@qrphotoframewidth=0pt%
\setlength{\fboxsep}{0pt}\fi%
\raisebox{1cm}{\framebox{\qrcode[hyperlink,height=\@qrphotowidth]{\@qrphoto}}}
}
}%
}% end new code <=====================================================
{}% success
{\fail}% failure
需要该命令\raisebox[1cm]
才能将二维码放在正确的位置(我没有搜索原因,为什么我在这里需要它)。使用的值对于生成的二维码的大小为 2cm(我用于示例代码)或更大是可以的。如果您的二维码应该更小,您需要将我的使用值更改为1cm
较低的值。您必须尝试一下。
如您所见,我删除了命令\includegraphics
。 使用包中的命令\qrphoto
\qrcode... qrcode
。
使用命令
\qrphoto[2cm][0.5pt]{https://tex.stackexchange.com/questions/474546/}
比如你可以添加一个高度和宽度为的二维码图片2cm
,图片周围有一个带线的框架0.5pt
,二维码图片的内容是https://tex.stackexchange.com/questions/474546/
(这个问题)。
因此,有了以下完整的 MWE
\documentclass[11pt,a4paper,sans]{moderncv}
\moderncvstyle{classic}
\usepackage{graphicx}
\usepackage{qrcode}
\firstname{John}
\familyname{Doe}
\address{83 Fancy Avenue}{Noweheresville}{Gotham City 24061}
\phone[mobile]{123 456 7890}
\email{[email protected]}
\makeatletter
\NewDocumentCommand{\qrphoto}{O{64pt}O{0.4pt}m}{\def\@qrphotowidth{#1}\def\@qrphotoframewidth{#2}\def\@qrphoto{#3}}
% to patch the code of moderncv, version 2.0.0
%\usepackage{etoolbox} % already loaded in moderncv <===================
\patchcmd{\makecvhead}%
{%
\ifthenelse{\isundefined{\@photo}}{}%
}% code to patch
{% new code <=========================================================
\ifthenelse{\isundefined{\@photo}}%
{%
\ifthenelse{\isundefined{\@qrphoto}}%
{}%
{%
\if@left%
\hspace*{\separatorcolumnwidth}\fi%
\color{black}% <======================== to get a black qrcode
\setlength{\fboxrule}{\@qrphotoframewidth}%
\ifdim\@qrphotoframewidth=0pt%
\setlength{\fboxsep}{0pt}\fi%
\raisebox{1cm}{\framebox{\qrcode[hyperlink,height=\@qrphotowidth]{\@qrphoto}}}
}
}%
}% end new code <=====================================================
{}% success
{\fail}% failure
\makeatother
%\photo[64pt][0.5pt]{example-image}
\qrphoto[2cm][0.5pt]{https://tex.stackexchange.com/questions/474546/} %
\begin{document}
\makecvtitle
\end{document}
您将获得以下结果:
请注意,您只能打印照片或二维码。如果您已定义\photo
,则\qrphoto
只会打印照片!
答案2
\photo
命令需要一个适合包含在\includegraphics
命令中的文件。因此,我认为最简单的解决方案是在文档中创建自己的二维码standalone
,并将结果用作 moderncv 中的照片。
%File qrcode.tex -> qrcode.pdf
\documentclass{standalone}
\usepackage{qrcode}
\begin{document}
\qrcode[hyperlink,height=64pt]{http://www.ctan.org}
\end{document}
\documentclass[11pt,a4paper,sans]{moderncv}
\moderncvstyle{classic}
\usepackage{qrcode}
\usepackage{graphicx}
\firstname{John}
\familyname{Doe}
\address{83 Fancy Avenue}{Noweheresville}{Gotham City 24061}
\phone[mobile]{123 456 7890}
\email{[email protected]}
\photo[64pt][0.5pt]{qrcode}
\begin{document}
\makecvtitle
\end{document}
更新:全部合为一体 ;-)
使用filecontents
包和\immediate
命令可以将两个文件合并为一个,然后一起编译:
\documentclass[11pt,a4paper,sans]{moderncv}
\moderncvstyle{classic}
\usepackage{qrcode}
\usepackage{filecontents}
\begin{filecontents*}{myqrcode.tex} %<- This is the qrcode file name
\documentclass{standalone}
\usepackage{qrcode}
\begin{document}
\qrcode[hyperlink,height=64pt]{http://www.ctan.org}
\end{document}
\end{filecontents*}
\immediate\write18{pdflatex myqrcode.tex}
\firstname{John}
\familyname{Doe}
\address{83 Fancy Avenue}{Noweheresville}{Gotham City 24061}
\phone[mobile]{123 456 7890}
\email{[email protected]}
\photo[64pt][0.5pt]{myqrcode} %<- Insert previous name
\begin{document}
\makecvtitle
\end{document}