我正在比较许多不同的案例,它们都遵循预定义的命名方案。现在我想用一个框替换名称中的一个字符,以指示此参数已针对比较的案例进行了更改。
这是我目前找到的解决方案,但我并不满意。
\documentclass[a4paper, 12pt]{article}
\usepackage{xcolor}
\begin{document}
1818{\color{red}\framebox{X}}cBb-1day
\textit{1818{\color{red}\framebox{X}}cBb-1day }
\emph{1818{\color{red}\framebox{X}}cBb-1day }
\end{document}
X
第一行相当不错,但我希望框的宽度与(我将在最终文档中将其设为白色)一样宽。
对于接下来的几行,我还有一个额外的问题,那就是我想将框调整为与文本风格相适应的风格(例如斜体或者我以后可能使用的任何风格)。
答案1
这利用了两个非常好的答案。Joseph Wright 在检测当前正在使用哪种文本“模式”(正常、斜体、粗体等)?告诉如何确定当前的字体形状,我用它来确定是否是斜体。
布鲁诺剪切变换一个“盒子”展示如何倾斜一个盒子。
同时,我使用 Bruno 的方法\slantbox
倾斜盒子,同时保留字母的斜体形状,而使用 Joseph 的方法确定我是否为斜体形状。
我要做的是确定适合此字体的倾斜度,我确定为 0.24。我还将 设置为\fboxsep
,-\fboxrule
以便方框字母占用的水平空间与底层字母完全相同。
编辑倾斜的框,同时保留框内的斜体部分,如f
框内的示例所示。
在 MWE 的最后,我展示了新宏的结果\itbox{}
。
\documentclass[a4paper, 12pt]{article}
\usepackage{xcolor}
% FROM BRUNO's ANSWER AT
% https://tex.stackexchange.com/questions/63179/shear-transform-a-box/63188#63188
\newsavebox{\foobox}
\newcommand{\slantbox}[2][.5]{\mbox{%
\sbox{\foobox}{#2}%
\hskip\wd\foobox
\pdfsave
\pdfsetmatrix{1 0 #1 1}%
\llap{\usebox{\foobox}}%
\pdfrestore
}}
% FROM JOSEPH'S ANSWER AT
% https://tex.stackexchange.com/questions/31649/detect-which-text-mode-normal-italic-bold-etc-is-currently-in-use
\makeatletter
\newcommand*{\IfItalicTF}{%
\ifx\f@shape\my@test@it
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\newcommand*{\my@test@it}{it}
\makeatother
%
\def\myfbox#1{\edef\tmp{\the\fboxsep}\fboxsep=-\fboxrule\relax%
\textcolor{red}{\IfItalicTF{\itbox{#1}}{\fbox{#1}}}%
\fboxsep=\tmp\relax%
}
\def\itslant{.24}
\def\itbox#1{\slantbox[\itslant]{\fbox{\slantbox[-\itslant]{\itshape#1}}}}
\parindent 0pt
\begin{document}
1818\myfbox{X}cBb-1day \par
\textit{1818\myfbox{X}cBb-1day }\par
\emph{1818\myfbox{X}cBb-1day }\par
\emph{1818f\myfbox{f}cBb-1day }\par
\itbox{this box should be italic}
\end{document}
一个简化的定义,可以自动计算当前字体的倾斜因子(存储在中\fontdimen1\font
);使用组我们可以确保颜色不会溢出并且\fboxsep
不需要恢复:
\makeatletter
\newcommand{\myfbox}[1]{%
\leavevmode % for \color
\begingroup
\fboxsep=-\fboxrule
\color{red}
\edef\computed@slant{\strip@pt\fontdimen1\font}%
\ifdim\computed@slant pt=\z@
% no slant, just do a simple \fbox
\fbox{#1}%
\else
\slantbox[\computed@slant]{\fbox{\slantbox[-\computed@slant]{#1}}}%
\fi
\endgroup
}
\makeatother
完整的示例,还显示宽度是正确的(ff
当然,示例中的连字符需要被打破)。
\documentclass[a4paper,12pt]{article}
\usepackage{xcolor}
% FROM BRUNO's ANSWER AT
% https://tex.stackexchange.com/questions/63179/shear-transform-a-box/63188#63188
\newsavebox{\foobox}
\newcommand{\slantbox}[2][.5]{\mbox{%
\sbox{\foobox}{#2}%
\hskip\wd\foobox
\pdfsave
\pdfsetmatrix{1 0 #1 1}%
\llap{\usebox{\foobox}}%
\pdfrestore
}}
\makeatletter
\newcommand{\myfbox}[1]{%
\leavevmode % for \color
\begingroup
\fboxsep=-\fboxrule
\color{red}
\edef\computed@slant{\strip@pt\fontdimen1\font}%
\ifdim\computed@slant pt=\z@
% no slant, just do a simple \fbox
\fbox{#1}%
\else
\slantbox[\computed@slant]{\fbox{\slantbox[-\computed@slant]{#1}}}%
\fi
\endgroup
}
\makeatother
\newcommand{\test}[1]{%
\sbox0{#1}#1 -- \the\wd0
}
\begin{document}
\test{1818XcBb-1day}\par
\test{1818\myfbox{X}cBb-1day}
\test{\textit{1818XcBb-1day}}\par
\test{\textit{1818\myfbox{X}cBb-1day}}
\test{\emph{1818XcBb-1day}}\par
\test{\emph{1818\myfbox{X}cBb-1day}}
\test{\emph{1818f{}fcBb-1day}}\par
\test{\emph{1818f\myfbox{f}cBb-1day}}
\end{document}
答案2
这是一个小的解决方案,但是看起来不太好 ;-)
\documentclass[a4paper, 12pt]{article}
\usepackage{xcolor}
\setlength{\fboxsep}{0pt}
\begin{document}
1818{\color{red}\framebox{X}}cBb-1day
\textit{1818{\color{red}\framebox{X}}cBb-1day }
\emph{1818{\color{red}\framebox{X}}cBb-1day }
\end{document}
一些针对倾斜框(和文本,但不是所要求的斜体)的改进版本
\documentclass[a4paper, 12pt]{article}
\usepackage{xcolor}
\usepackage{xparse}
\usepackage{tikz}
\NewDocumentCommand{\namingscheme}{D<>{}O{white}mO{X}}{%
\begingroup
\setlength{\fboxsep}{0pt}
\tikz\node[#1] {1818\textcolor{#2}{\fbox{#4}}#3};
\endgroup
}
\begin{document}
1818{\color{red}\framebox{X}}cBb-1day
\textit{1818{\color{red}\framebox{X}}cBb-1day }
\emph{1818{\color{red}\framebox{X}}cBb-1day }
\textit{\namingscheme<xslant=0.15>[red]{cBb-1day}}
\end{document}
免责声明:我偷了来自 Gonzalo Medina 对我的一个问题的回答的倾斜文字的代码:不同视口中的文本
答案3
这是一个仅针对非斜体文本的简单解决方案。我认为斜体文本看起来也不错,但你可能不同意。
\documentclass{article}
\usepackage{amssymb}
\begin{document}
sample$\Box{}$text
\textit{sample$\Box{}$text}
\end{document}