我写了一个.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,但没有成功。.cls
article.cls
mypackage
.cls
adjustbox
begin{minipage}{<width>, right}
我知道问题出在\ifdef{\@photodiameter}{\begin{minipage}{\dimexpr\linewidth-\@photodiameter-2em\relax}}{}%
和 上\begin{minipage}{\@photodiameter}
。文本小页面首先被引入,因此被放在照片小页面的左边。我无法轻易切换两者,因为\@photodiameter
在文本小页面中定义。
所有其他选项(nophoto
、nophotocenter
和normalphoto
)都可以正常工作。
另外:如果相关的话我会使用表格和里面的一些命令\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}