以下是 MWE:
\documentclass[12pt]{scrartcl}
%%Footnote Mods%%
\deffootnote[1.8em]{0pt}{1.6em}{\textsuperscript{\thefootnotemark}}
%%%%%%
\begin{document}
Sample text%
%
\footnote{Footnote text}
%
\end{document}
如何将脚注标记的顶部与脚注文本的顶部对齐(在 MWE 中,我希望“1”的顶部与“F”齐平)?
新错误:在实施 Werner 的(伟大)解决方案时,我尝试将任何带有“\”的内容添加到脚注文本中时遇到错误。
观察:
\documentclass[12pt]{scrartcl}% http://ctan.org/pkg/koma-script
\usepackage{xstring}% http://ctan.org/pkg/xstring
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\makeatletter
% Patch \scr@saved@footnotetext to extract first character of footnote and store in \fnfirstchar
\patchcmd{\scr@saved@footnotetext}% <cmd>
{\@makefntext}% <search>
{\StrLeft{#1}{1}[\fnfirstchar]\@makefntext}% <replace>
{}{}% <success><failure>
\begin{document}
\makeatletter
\deffootnote[1.8em]{0pt}{1.6em}{%
\settoheight{\@tempdima}{\fnfirstchar}% Height of first character in footnote
\settoheight{\@tempdimb}{$\scriptstyle\thefootnotemark$}% Height of footnote mark
\raisebox{\dimexpr\@tempdima-\@tempdimb}{$\scriptstyle\thefootnotemark$}}
\makeatother
Sample text\footnote{Footnote text: \S modified}.
\end{document}
答案1
对此的简短回答是“精确放置”并不总是可行的。为什么?重要的是要注意 TeX 使用的是框而不是字符。每个字符都有一个边界框,定义其水平和垂直大小/结构。因此,元素的对齐只能达到这些框的精度。从这个意义上讲,您能做的最好的事情可能是:
\makeatletter
\deffootnote[1.8em]{0pt}{1.6em}{%
\settoheight{\@tempdima}{F}% Height of F
\settoheight{\@tempdimb}{$\scriptstyle\thefootnotemark$}% Height of footnote mark
\raisebox{\dimexpr\@tempdima-\@tempdimb}{$\scriptstyle\thefootnotemark$}}
\makeatother
这将分别将 的高度F
和\scriptstyle
脚注标记存储在\@tempdima
和中\@tempdimb
(这些是临时寄存器)。然后它将脚注标记(由 给出\thefootnotemark
)提升到正确的高度。由于“装箱限制”,输出不符合预期。下面是一个显示不同输出的最小示例,仅作为示例。它还进行了更新以捕获脚注的第一个字符(而不是将其固定为字符F
):
\documentclass[12pt]{scrartcl}% http://ctan.org/pkg/koma-script
\usepackage{xstring}% http://ctan.org/pkg/xstring
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\makeatletter
% Patch \scr@saved@footnotetext to extract first character of footnote and store in \fnfirstchar
\patchcmd{\scr@saved@footnotetext}% <cmd>
{\@makefntext}% <search>
{\StrLeft{#1}{1}[\fnfirstchar]\@makefntext}% <replace>
{}{}% <success><failure>
\begin{document}
% Original footnote modification
\deffootnote[1.8em]{0pt}{1.6em}{\textsuperscript{\thefootnotemark}}
Sample text\footnote{Footnote text: original}.
\addtocounter{footnote}{-1}% Restore counter value
\makeatletter
\deffootnote[1.8em]{0pt}{1.6em}{%
\settoheight{\@tempdima}{\fnfirstchar}% Height of first character in footnote
\settoheight{\@tempdimb}{$\scriptstyle\thefootnotemark$}% Height of footnote mark
\raisebox{\dimexpr\@tempdima-\@tempdimb}{$\scriptstyle\thefootnotemark$}}
\makeatother
Sample text\footnote{Footnote text: modified}.
\end{document}
xstring
捕获脚注的第一个字符(通过\StrLeft
)并将其存储在中\fnfirstchar
,同时etoolbox
通过在正确的位置插入提取来修补适当的命令(后脚注文本已被阅读,但前正在排版)。
如图所示,将脚注标记和F
字符括起来表明它们位于同一高度(正如 TeX 所看到的):
答案2
一种不太技术性但更符合印刷习惯的方法可能是使用包superiors
. 引用手册中的话:
LaTeX 中脚注和尾注标记的默认行为是将数字打印为数学上标。在大多数情况下,这意味着大小约为正常衬线数字的 70%,顶部略高于大写字母的顶部。在许多情况下,上标数字在所有尺寸上都缩小了约 70%,使它们看起来相当小,但过高。[...]
另外,也可以使用上部数字 - 小数字,通常为内衬数字高度的 50% 到 60%,例如 1234567890。通常,它们的设计使得数字的顶部与字体中大写字母的顶部对齐,但有时会稍高一些,与上升部高度相对应。
\documentclass[12pt]{scrartcl}
%%Footnote Mods%%
\deffootnote[1.8em]{0pt}{1.6em}{\textsu{\thefootnotemark}\,}
%%%%%%
\usepackage{newtxtext}
\usepackage[supstfm=ntxsups,supspaced=.06em]{superiors}
\begin{document}
Sample text%
%
\footnote{Footnote text}
%
\end{document}
此外,包选项raised=<dim>
还允许调整上标数字的垂直位置。当然,垂直位置不取决于后面的字符。(但如果后面的标记是小标记a
或控制序列怎么办?)
答案3
我认为 Werner 的解决方案不需要加载任何包。电子工具箱和字符串是相对较大的包裹。
\documentclass[12pt]{scrartcl}
\makeatletter
\begingroup
\let\@tempa\scr@saved@footnotetext
\edef\@tempa{\endgroup
\def\noexpand\scr@saved@footnotetext##1{%
\unexpanded\expandafter{\@tempa{#1}}%
\unexpanded{\fngetfirstchar\fnfirstchar{#1}}%
}%
}
\@tempa
\def\fngetfirstchar#1#2{%
\begingroup
\def\@tempa##1##2\fn@nil{\endgroup\gdef#1{##1}}%
\expandafter\@tempa#2\fn@nil
}
\def\usenewfootnotestyle{%
\deffootnote[1.8em]{0pt}{1.6em}{%
\begingroup
\let\s\ensuremath
\settoheight{\@tempdima}{\fnfirstchar}%
\settoheight{\@tempdimb}{\s{\scriptstyle\thefootnotemark}}%
\raisebox{\dimexpr\@tempdima-\@tempdimb}{\s{\scriptstyle\thefootnotemark}}%
\endgroup
}%
}
\makeatother
\begin{document}
% Original footnote style:
\deffootnote[1.8em]{0pt}{1.6em}{\textsuperscript{\thefootnotemark}}
Sample text\footnote{Footnote text: original}.
\par
\addtocounter{footnote}{-1}
% Change footnote style:
\usenewfootnotestyle
Sample text\footnote{Footnote text: modified}.
\end{document}