你好(抱歉我用的是英式果酱),
我尝试定义一个环境练习。我想自动定义标签。
为什么?第一个也是唯一的目标就是在我的结构中更快地看到我的练习在哪里以及我有多少这种类型的练习。
我的代码:
\documentclass[11pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
%--hyperref
\usepackage[pdfborder={0 0 0}]{hyperref} %pour que les références soient des liens hypertextes
%\usepackage{charter} %Modif des polices : charter, newcent, mathptmx, mathpple...
\hypersetup{
colorlinks=true,
linkcolor=blue,
filecolor=magenta,
urlcolor=cyan,
}
%------Operation math et latex
\usepackage{etoolbox}
\newcounter{exo}
\makeatletter
\newenvironment{exo}[1]%
{\refstepcounter{exo}%
\protected@edef\@currentlabelname{#1}% addition here
\vspace{0.5cm}\noindent
\fbox{
{\large\bfseries{Exercice \theexo~: #1} \par}\label{#1}
{\par\vspace{0.5cm}}}}
\makeatother
\begin{document}
\begin{exo}{type}
Derivate this function $f(x)=x$
\end{exo}
\end{document}
第一个问题:它可以工作(我可以使用 \ref)但我在我的结构视图上看不到它(我使用 texmaker)而这正是我的目标。
评论:编辑器看不到环境内的标签,所以这不是办法。
第二个问题:如果类型为空,我会遇到错误,因为 \label 等待信息 想法:如何用 ifempty
''' \ifx&% % #1 为空 \label{theexo} \else % #1 为非空 \label{#1} \fi ''' 来解决这个问题
另一种尝试:改变 \subsection 以将其用作练习,但不确定这是否是一个好的解决方案。
感谢您的所有帮助。
安吉
答案1
我简化了你的代码,因为它似乎不必要地复杂。例如,为什么同时有\label{#1}
和\protected@edef\@currentlabelname{#1}
?
我进一步强烈建议您指定环境exo
采用 2 个参数:第一个参数指定交叉引用中使用的标签,第二个参数指定标题字符串。如果您愿意,可以对两个参数使用相同的字符串(例如“type”);但是,我建议您保留使用两个不同参数的灵活性。这样,如果您选择在将来的某个时间点更改标题字符串,则不必更改各种命令的参数\ref
。
\documentclass[11pt,a4paper]{article}
%%\usepackage[utf8]{inputenc} % that's the default nowadays
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[margin=2.5cm]{geometry} % choose suitable page parameters
%\usepackage{etoolbox} % doesn't seem to be needed
\newcounter{exo}
%\makeatletter % not needed anymore
\newenvironment{exo}[2]%
{\refstepcounter{exo}\label{#1}%
\vspace{0.5cm}
\noindent
\fbox{\large\bfseries Exercice \theexo\,: #2}\space}
{\par\vspace{0.5cm}}
%\makeatother % also not needed anymore
\usepackage{hyperref} % load this package almost last
\hypersetup{colorlinks=true, allcolors=blue}
\usepackage[nameinlink,french]{cleveref} % load this package last
\crefname{exo}{exercice}{exercices}
\begin{document}
\begin{exo}{ex_type}{type}
Créer la fonction $f(x)=x$.
\end{exo}
\noindent
Une référence croisée à l'\cref{ex_type}.
\end{document}