Я пытаюсь создать цветной блок с LaTeX
двумя строками. Я хочу, чтобы текст был выровнен по центру. В идеале я хочу иметь возможность менять шрифт текста и размер цветного блока.
Итак, пример того, к чему я стремлюсь, находится в левой части изображения:
Я перепробовал множество вещей, в основном из предыдущего поста (Установить размер \colorbox для одного символа). Но я сталкиваюсь с ошибками по разным причинам. Вот MWE.tex
что я создал с помощью двух попыток, которые кажутся наиболее близкими к тому, чего я пытаюсь достичь:
\documentclass[paper=letterpaper,fontsize=10pt]{article}
\usepackage{amsmath,amsfonts,amsthm}
\usepackage{graphicx}
\usepackage[svgnames]{xcolor}
\usepackage{geometry}
\usepackage{url}
\usepackage{wrapfig}
\frenchspacing
\pagestyle{empty}
\usepackage{sectsty}
\sectionfont{
\usefont{OT1}{phv}{b}{n}%
\sectionrule{0pt}{0pt}{-5pt}{3pt}
}
\usepackage{eqparbox}
%%% BEGIN DOCUMENT ------------------------------------------------------------
\begin{document}
\vspace*{-7em}
%First attempt%
\noindent \colorbox{Black}{\parbox{4em} \hfill \color{White} \Huge \usefont{OT1}{phv}{b}{n} FirstName}
\vspace*{-.3mm} %doesn't work
\newline
\noindent \colorbox{Black}{\parbox{4em} \hfill \color{White} \Huge \usefont{OT1}{phv}{b}{n} LastName}
%Second attempt%
\noindent \colorbox{Black}{\makebox(60,30){\textcolor{white}{FirstName}}}
\newline
\vspace*{-2em} %doesn't work
\noindent \colorbox{Black}{\makebox(60,30){\textcolor{white}{LastName}}}
\vspace*{5em}
\vspace{2em}
My CV would follow here
\end{document}
После запуска lualatex MWE.tex я получаю вывод, показывающий результаты моих двух попыток, который выглядит следующим образом:
В обеих попытках мне трудно избавиться от очевидного различия между двумя полями, разделяющими FirstName и LastName. Я начал задаваться вопросом, может ли быть более простое решение моей проблемы, и, возможно, такое, в котором мне не нужно создавать два отдельных поля.
Я пробовал разные альтернативы, такие как:
\noindent \colorbox{Black}{\makebox(60,60){\textcolor{white}{FirstName \n LastName}}}
Но я все еще не могу достичь желаемого результата. Любой совет, как всегда, очень ценен!
решение1
На самом деле это (гораздо, намного, намного) проще и tcolorbox
имеет множество вариантов.
\documentclass[paper=letterpaper,fontsize=10pt]{article}
\usepackage{amsmath,amsfonts,amsthm}
\usepackage{graphicx}
\usepackage[svgnames]{xcolor}
\usepackage[most]{tcolorbox}
\usepackage{geometry}
\usepackage{url}
\usepackage{wrapfig}
\frenchspacing
\pagestyle{empty}
\usepackage{sectsty}
\sectionfont{
\usefont{OT1}{phv}{b}{n}%
\sectionrule{0pt}{0pt}{-5pt}{3pt}
}
%\usepackage{eqparbox} % ??? What's this?
%%% BEGIN DOCUMENT ------------------------------------------------------------
\begin{document}
\begin{tcbraster}[raster columns=2,raster equal height]
\begin{tcolorbox}[enhanced jigsaw, % needed to really the frame off!
colback=black, % black background
coltext=white, % white text
halign=center, % center
fontupper={\Huge \bfseries}, % change the font here
sharp corners, % no rounded corners
colframe=black, % not really necessary
boxrule=0pt % frame off
]
FirstName
LastName
\end{tcolorbox}
\begin{tcolorbox}[enhanced jigsaw,sharp corners,coltext=black,colback=white,boxrule=0pt]
\begin{itemize}
\item Github
\item LinkedIn
\item Phone
\end{itemize}
\end{tcolorbox}
\end{tcbraster}
\end{document}
решение2
Это еще одинtcolorboxрешение, использующее библиотеки skins
и xparse
.xparseиспользуется для определения новой команды
\namebox{<first names>}{<last name>}{<content of right hand box e.g. list>}
Ширина левого блока адаптируется к содержимому верхней и нижней частей. Общая структура состоит из sidebyside
блока, который адаптируется к ширине левого блока. Левая сторона блока состоит из следующего tcolorbox
с верхней и нижней частями. Правая сторона блока состоит из того, что находится в третьем аргументе — в данном случае, списка.
Это, вероятно, легче продемонстрировать, чем объяснить:
\namebox{First Names}{Last Name}{%
\begin{itemize}
\item[\faGithubSquare] github.com/Repository
\item[\faLinkedinSquare] linkedin.com/Account
\item[\faMobile] 0123 456789
\end{itemize}%
}
В этом случае первый аргумент занимает большую ширину, чем второй, поэтому левая часть будет установлена с учетом ширины First Names
.
\namebox{Short Name}{Somewhat Longer Name}{%
\begin{itemize}
\item[\faGithubSquare] github.com/Repository
\item[\faLinkedinSquare] linkedin.com/Account
\item[\faMobile] 0123 456789
\end{itemize}%
}
В этом случае второму аргументу требуется больше места, чем первому, поэтому размер левого поля будет подобран так, чтобы вместить Somewhat Longer Name
.
В обоих случаях оставшаяся часть ширины строки будет доступна для содержимого правой стороны, т.е. в данном случае для списка со значками.
\DeclareRobustCommand{\nameboxfont}{\normalfont\sffamily\bfseries\Large\baselineskip14pt}
устанавливает шрифт, который будет использоваться для содержимого полей. Адаптируйте по желанию.
Определены два стиля, которые определяют стили, используемые для коробок.
\tcbset{%
name box/.style={%
Этот стиль использован для двухэтажного бокса слева.
colback=black,
Черный фон.
lower separated=false,
Нет линии, разделяющей верхнюю часть от нижней.
coltext=white,
Белый текст.
fontupper=\nameboxfont,
fontlower=\nameboxfont,
Применяет шрифт, определенный ранее, к обеим частям поля.
halign=center,
halign lower=center,
Выравнивает текст в верхнем и нижнем слоях по центру.
sharpish corners,
По умолчанию используются закругленные углы. Я использовал sharpish corners
здесь. Другая возможность — sharp corners
. Попробуйте посмотреть, что вам нравится.
middle=.75mm,
Хотя в руководстве указано иное, это, по-видимому, половина расстояния между верхней и нижней частями коробки. (В руководстве указано, что этов дополнение к boxsep
, но, похоже, это не так.)
},
Вот и все, стиль готов.
two by two/.style={%
Это стиль большой коробки, в которую входит все.
sidebyside gap=1mm,
Расстояние между левым черным ящиком и правой стороной, содержащей список.
lower separated=false,
Как и выше: линии нет.
halign upper=left,
halign lower=left,
Устанавливает выравнивание левого черного поля left
и выравнивание правого списка на left
.
sidebyside adapt=left,
Адаптирует ширину деталей к ширине материала слева.
empty,
Без фона, линий и т.п.
size=minimal,
Не добавляйте дополнительных интервалов.
Этот блок носит исключительно структурный характер: его цель — выравнивать элементы, а не выглядеть как блок, поэтому нам нужна эта урезанная «голая» версия, предоставляемая библиотекой skins
.
},
С этим стилем мы тоже закончили.
}
Это все стили, которые нам нужны.
Нам также нужно иметь несколько дополнительных размеров для измерений.
\newlength\nameboxtempa
\newlength\nameboxtempb
Вот определение последней команды \namebox{}{}{}
:
\NewDocumentCommand \namebox { m m +m }{%
\settowidth\nameboxtempa{\nameboxfont #1}%
\settowidth\nameboxtempb{\nameboxfont #2}%
Измеряем ширину первого и второго аргументов.
\ifdim\nameboxtempa<\nameboxtempb\setlength\nameboxtempa{\nameboxtempb}\fi%
Теперь сравним ширины. Если ширина материала снизу (фамилия) больше ширины материала сверху (имена), то мы устанавливаем ширину \nameboxtempa
на ширину нижнего бита. В противном случае \nameboxtempa
это уже та ширина, которую мы хотим.
\tcbsidebyside[two by two]{%
Примените наш стиль для большой коробки.
\begin{tcolorbox}[%
Начните с поля слева.
name box,
Примените для этого наш стиль.
text width=\nameboxtempa,
Установите ширину, равную той, \nameboxtempa
которая гарантирует, что она вмещает только самую длинную из двух строк, которые она будет содержать.
]
#1
Здесь указываются имена.
\tcblower
#2
Фамилия указывается в нижней части.
\end{tcolorbox}%
Закройте среду, и мы закончим с левой стороной большого внешнего ящика.
}{%
#3
Правая часть этого поля получает то, что указано в третьем аргументе.
}
}
Полный код:
\documentclass{article}
\usepackage{tcolorbox,fontawesome}
\tcbuselibrary{xparse,skins}
\DeclareRobustCommand{\nameboxfont}{\normalfont\sffamily\bfseries\Large\baselineskip14pt}
\newlength\nameboxtempa
\newlength\nameboxtempb
\NewDocumentCommand \namebox { m m +m }{%
\settowidth\nameboxtempa{\nameboxfont #1}%
\settowidth\nameboxtempb{\nameboxfont #2}%
\ifdim\nameboxtempa<\nameboxtempb\setlength\nameboxtempa{\nameboxtempb}\fi%
\tcbsidebyside[two by two]{%
\begin{tcolorbox}[%
name box,
text width=\nameboxtempa,
]
#1
\tcblower
#2
\end{tcolorbox}%
}{%
#3
}
}
\tcbset{%
name box/.style={%
colback=black,
lower separated=false,
coltext=white,
fontupper=\nameboxfont,
fontlower=\nameboxfont,
halign=center,
halign lower=center,
sharpish corners,
middle=.75mm,
},
two by two/.style={%
sidebyside gap=1mm,
boxrule=0pt,
boxsep=0pt,
lower separated=false,
halign upper=left,
halign lower=left,
sidebyside adapt=left,
empty,
size=minimal,
},
}
\begin{document}
\namebox{First Names}{Last Name}{%
\begin{itemize}
\item[\faGithubSquare] github.com/Repository
\item[\faLinkedinSquare] linkedin.com/Account
\item[\faMobile] 0123 456789
\end{itemize}%
}
\namebox{Short Name}{Somewhat Longer Name}{%
\begin{itemize}
\item[\faGithubSquare] github.com/Repository
\item[\faLinkedinSquare] linkedin.com/Account
\item[\faMobile] 0123 456789
\end{itemize}%
}
\end{document}
решение3
Простое решение с tabular
окружающей средой и colortbl
:
\documentclass[paper=letterpaper,fontsize=10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{geometry}
\usepackage{cabin}
\usepackage{fontawesome}
\usepackage{amsmath}
\usepackage{graphicx, array, multirow, makecell,}
\usepackage[svgnames, table]{xcolor}
\usepackage{url}
\frenchspacing
\pagestyle{empty}
\renewcommand\theadfont{\normalsize\bfseries\color{white}}
%%% BEGIN DOCUMENT ------------------------------------------------------------
\begin{document}
\sffamily
\begin{tabular} {>{\columncolor{black}}ccl}
& \faGithub & Github.com/Lastname\\
& \faLinkedin & Linkedin.com/Lastname\\
\multirowthead{-3}{First name\\Last name} & \faMobile& 1234.5678
\end{tabular}
\end{document}