重新定义 \ref 命令以避免 \textit

重新定义 \ref 命令以避免 \textit

我(不是我,回答使用章节符号 (§) 来交叉引用章节)重新定义了命令\ref以便能够获取符号\S

\makeatletter
\renewcommand*{\p@section}{\SectionSymbol}% Add section symbol to section reference
\makeatother

当我处于斜体环境(如定理)时,问题就出现了。然后,给出的数字\ref{whatever}是斜体。我该如何解决它(cleveref如果可能的话,避免使用包)?

平均能量损失

\documentclass{article}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{lipsum}

\newtheorem{remark}{Remark}

\makeatletter
\renewcommand*{\p@section}{\S}% Add section symbol to section reference
\renewcommand*{\p@subsection}{\P}
\makeatother

\begin{document}

\section{A}

\lipsum[1]

\subsection{A.1}
\label{a}

\lipsum[2]

\subsection{A.2}

\begin{remark}
\ref{a} \lipsum[2]
\end{remark}

\end{document}

答案1

\ref不建议改变。改变\p@section\p@subsection,而是先吞食\thesection\thesubsection,然后再切换回\normalfont组内。

当然,如果还有其他参考资料要做,这将会很棘手。

这与我提供的答案类似这里!

\documentclass{article}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{lipsum}

\newtheorem{remark}{Remark}

\makeatletter
\def\gobblesomething#1\csname thesection\endcsname{\begingroup\normalfont\S\thesection\endgroup}
\def\gobblesomethingother#1\csname thesubsection\endcsname{\begingroup\normalfont\P\thesubsection\endgroup}
\renewcommand{\p@section}{\gobblesomething}
\renewcommand{\p@subsection}{\gobblesomethingother}

\makeatother

\begin{document}

\section{A}

\lipsum[1]

\subsection{A.1}
\label{a}

\lipsum[2]

\subsection{A.2}

\begin{remark} \label{b}
See \ref{a} \lipsum[2]
\end{remark}

And what about \ref{a} or \ref{b}?
\end{document}

类似的问题是这个:在文本中引用附录对象为“A.1”,而不是“附录 A.1”

答案2

重新定义内部\@setref以始终选择 upshape 是有意义的:

\documentclass{article}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{etoolbox}

\usepackage{lipsum}

\newtheorem{remark}{Remark}

\makeatletter
\patchcmd{\@setref}{\expandafter#2#1}{\textup{\expandafter#2#1}}{}{}
\renewcommand*{\p@section}{\S}% Add section symbol to section reference
\renewcommand*{\p@subsection}{\P}
\makeatother

\begin{document}

\section{A}\label{b}

\lipsum[1]

\subsection{A.1}
\label{a}

\lipsum[2]

\subsection{A.2}

\begin{remark}
See \ref{a} and \ref{b} \lipsum[2]
\end{remark}

\end{document}

在此处输入图片描述

如果hyperref需要的话,补丁会更复杂一些。

\documentclass{article}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{etoolbox}
\usepackage{hyperref}

\usepackage{lipsum}

\newtheorem{remark}{Remark}

\makeatletter
\catcode`#=12
\AtBeginDocument{%
  \patchcmd{\@setref}
    {\expandafter\Hy@setref@link#1\@empty\@empty\@nil{#2}}
    {\textup{\expandafter\Hy@setref@link#1\@empty\@empty\@nil{#2}}}
    {}{}%
}
\catcode`#=6
\patchcmd{\real@setref}{\expandafter#2#1}{\textup{\expandafter#2#1}}{}{}
\renewcommand*{\p@section}{\S}% Add section symbol to section reference
\renewcommand*{\p@subsection}{\P}
\makeatother

\begin{document}

\section{A}\label{b}

\lipsum[1]

\subsection{A.1}
\label{a}

\lipsum[2]

\subsection{A.2}

\begin{remark}
See \ref{a} and \ref{b} \lipsum[2]
\end{remark}

\end{document}

答案3

如果只需要删除斜体,\ref您可以定义一个\upshape版本\ref,如下所示:

\let\refBKP\ref
\renewcommand{\ref}[1]{{\upshape\refBKP{#1}}}

然后您的所有\ref命令将不再以斜体显示。

相关内容