如何用二维码替换 moderncv classic 中的照片?

如何用二维码替换 moderncv classic 中的照片?

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

在类样式的代码中moderncvclassic您可以找到一个 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}

您将获得以下结果:

生成的 pdf

请注意,您只能打印照片或二维码。如果您已定义\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}

相关内容