用于在标题中交换文本和图像的包/类选项

用于在标题中交换文本和图像的包/类选项

我写了一个.cls文件,其中有一个命令\makecvheader,可以制作如下所示的标题:

在此处输入图片描述

我已经写了一些类选项,并且想要添加另一个:一个在左侧显示图像而在右侧显示文本(带有 raggedleft)的选项,名为photoleft

由于的(当前)定义\makecvheader,我似乎无法找到让此选项执行其应执行的操作的方法,也无法找到使其与其他选项兼容的方法。

photoleft需要与其他已经存在的包选项配合良好:

  • nophoto(附photoleft:右侧有文字,无照片)
  • nophotocenter(不兼容photoleft
  • normalphoto(附photoleft:左侧为矩形照片,右侧为文字)

由于使用minipage环境和ifdef,我卡住了。我得到的结果是:

在此处输入图片描述

以下是 MWE:

\documentclass[a4paper]{article}

\begin{filecontents}[overwrite]{mypackage.sty}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mypackage}

% No photo:
\newif\if@nophoto
\DeclareOption{nophoto}{\@nophototrue}
% No photo, centered text:
\newif\if@nophotocentered
\DeclareOption{nophotocenter}{\@nophotocenteredtrue \@nophototrue}
% Photo on the left side, text on the right:
\newif\if@photoleft
\DeclareOption{photoleft}{\@photolefttrue}
% Rectangular photo:
\newif\if@normalphoto
\DeclareOption{normalphoto}{\@normalphototrue}
\DeclareOption*{\PackageWarning{mypackage}{No option ‘\CurrentOption’}}
\ProcessOptions\relax

\RequirePackage[T1]{fontenc}
\RequirePackage{geometry}          
\RequirePackage{fontawesome}       
\RequirePackage{xcolor}            
\RequirePackage[most]{tcolorbox}   
\RequirePackage{graphicx}        
\RequirePackage{dashrule}      
\RequirePackage{hyperref}         
\RequirePackage{tabularray}         
\RequirePackage{adjustbox}    
\geometry{%
        left=23mm,
        right=23mm, 
        bindingoffset=0mm, 
        top=20mm,
        bottom=20mm
    }

\newcommand{\linia}{\rule{\linewidth}{0.5pt}}
\newcommand{\name}[1]{\def\@name{#1}}
\newcommand{\tagline}[1]{\def\@tagline{#1}}
\newcommand{\personalinfo}[1]{\def\@personalinfo{#1}}
\newcommand{\photo}[2]{\def\@photo{#2}\def\@photodiameter{#1}}

\newcommand{\makecvheader}{%
  \begingroup
    \if@nophoto
        \begin{minipage}{\dimexpr\linewidth-2em\relax}
    \else
        \ifdef{\@photodiameter}{\begin{minipage}{\dimexpr\linewidth-\@photodiameter-2em\relax}}{}%
    \fi
    \if@nophotocentered
        \centering
    \fi
    \if@photoleft
        \raggedleft
    \fi
    {\Huge\bfseries\@name\par}
    \medskip
    {\large\@tagline\par}
    \medskip
    {\footnotesize\@personalinfo\par}
    \ifdef{\@photodiameter}{%
    \end{minipage}\hfill%
    \if@nophoto
        % Don't include photo
    \else
        \begin{minipage}{\@photodiameter}
        \if@normalphoto
          \includegraphics[width=\linewidth]{\@photo}
        \else
          \tikz\path[fill overzoom image={\@photo}]circle[radius=0.5\linewidth];
        \fi%
        \end{minipage}\par}{}%
    \fi%
  \endgroup\vspace{\baselineskip}
    \noindent\linia \medskip
}%


\end{filecontents}

\usepackage[photoleft]{mypackage}

\name{Firstname Lastname}
\tagline{tagline here}
\personalinfo{
Here is something \\
More text \\
Something.
}
\photo{2.8cm}{example-image-a}

\begin{document}

\makecvheader

\end{document}

这里我使用包而不是文件以方便使用,但结果与基于A4 纸和 中给出的边距调整的结果.cls相同。我还包含了我导入的每个包,因为包不多,并且以防与提供的解决方案不兼容。此外,据说包可以执行的操作使小页面出现在右侧。我尝试了此操作并在文本环境中使用 if,但没有成功。.clsarticle.clsmypackage.clsadjustboxbegin{minipage}{<width>, right}

我知道问题出在\ifdef{\@photodiameter}{\begin{minipage}{\dimexpr\linewidth-\@photodiameter-2em\relax}}{}%和 上\begin{minipage}{\@photodiameter}。文本小页面首先被引入,因此被放在照片小页面的左边。我无法轻易切换两者,因为\@photodiameter在文本小页面中定义。

所有其他选项(nophotonophotocenternormalphoto)都可以正常工作。



另外:如果相关的话我会使用表格和里面的一些命令\personalinfo如果它与您的解决方案无关,您可以忽略此位(但这在您的解决方案中起作用至关重要)。如果你的解决方案中没有使用 minipage 环境,那么使用下面的代码时一定不会出错。下面是一个例子:

\definecolor{soft_text}{rgb}{0.45,0.45,0.45}
\newcommand{\printinfo}[2]{\mbox{\textcolor{icons}{\normalfont #1}\hspace{1em}\textcolor{soft_text}{#2}\hspace{2em}}}

\newcommand{\emailsymbol}{\faAt}
\newcommand{\phonesymbol}{\faPhone}

\newcommand{\email}[1]{\printinfo{\emailsymbol}{\hspace{-0.2em}\href{mailto:#1}{#1}}}
\newcommand{\phone}[1]{\printinfo{\phonesymbol}{\hspace{-0.1em}#1}}

以下是个人信息:

\personalinfo{%
%%   You can add your own with \printinfo{<symbol>}{<text>}
  \begin{tabular}{l l}
  
  \email{[email protected]} &
  \phone{000-00-0000} %\tabularnewline
 
  \end{tabular}
}

它看起来像这样(图片来自项目,而不是上面的例子):

在此处输入图片描述

答案1

只需将照片放在 的\if@photoleft文本(包括 )前面\hfill和 的文本后面即可\if@photoleft\else。我还精简了您的\ifdef-tests 以仅执行\ifdef\@photodiameter{}{\@nophototrue},并将您的文本放置转换为宏,以使 的宽度和范围minipage更容易掌握(这样代码应该更容易维护)。

\documentclass[a4paper]{article}

\begin{filecontents}[overwrite]{mypackage.sty}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mypackage}

% No photo:
\newif\if@nophoto
\DeclareOption{nophoto}{\@nophototrue}
% No photo, centered text:
\newif\if@nophotocentered
\DeclareOption{nophotocenter}{\@nophotocenteredtrue \@nophototrue}
% Photo on the left side, text on the right:
\newif\if@photoleft
\DeclareOption{photoleft}{\@photolefttrue}
% Rectangular photo:
\newif\if@normalphoto
\DeclareOption{normalphoto}{\@normalphototrue}
\DeclareOption*{\PackageWarning{mypackage}{No option ‘\CurrentOption’}}
\ProcessOptions\relax

\RequirePackage[T1]{fontenc}
\RequirePackage{geometry}          
\RequirePackage{fontawesome}       
\RequirePackage{xcolor}            
\RequirePackage[most]{tcolorbox}   
\RequirePackage{graphicx}        
\RequirePackage{dashrule}      
\RequirePackage{hyperref}         
\RequirePackage{tabularray}         
\RequirePackage{adjustbox}    
\geometry{%
        left=23mm,
        right=23mm, 
        bindingoffset=0mm, 
        top=20mm,
        bottom=20mm
    }

\newcommand{\linia}{\rule{\linewidth}{0.5pt}}
\newcommand{\name}[1]{\def\@name{#1}}
\newcommand{\tagline}[1]{\def\@tagline{#1}}
\newcommand{\personalinfo}[1]{\def\@personalinfo{#1}}
\newcommand{\photo}[2]{\def\@photo{#2}\def\@photodiameter{#1}}

\newcommand*\cvheader@photo
  {%
    \if@nophoto
        % Don't include photo
    \else
        \begin{minipage}{\@photodiameter}%
        \if@normalphoto
          \includegraphics[width=\linewidth]{\@photo}%
        \else
          \tikz
            \path[fill overzoom image={\@photo}]circle[radius=0.5\linewidth];%
        \fi
        \end{minipage}%
    \fi%
  }

\newcommand*\cvheader@text[1]
  {%
    \begin{minipage}{#1}%
      \if@nophotocentered
          \centering
      \fi
      \if@photoleft
          \raggedleft
      \fi
      {\Huge\bfseries\@name\par}%
      \medskip
      {\large\@tagline\par}%
      \medskip
      {\footnotesize\@personalinfo\par}%
    \end{minipage}%
  }

\newcommand{\makecvheader}{%
  \begingroup
    \ifdef\@photodiameter{}{\@nophototrue}%
    \if@photoleft
      \cvheader@photo
      \hfill
    \fi
    \if@nophoto
      \cvheader@text{\dimexpr\linewidth-2em\relax}%
    \else
      \cvheader@text{\dimexpr\linewidth-\@photodiameter-2em\relax}%
    \fi
    \if@photoleft\else
      \hfill
      \cvheader@photo
    \fi
    \par
  \endgroup
  \vspace{\baselineskip}%
  \noindent\linia
  \medskip
}%
\end{filecontents}

\usepackage[photoleft]{mypackage}

\name{Firstname Lastname}
\tagline{tagline here}
\personalinfo{
Here is something \\
More text \\
Something.
}
\photo{2.8cm}{example-image-a}

\begin{document}

\makecvheader

\end{document}

相关内容