自动换行且带下划线的居中长标题的论文封面一种绘图实现

news2024/11/15 8:38:24

自动换行且带下划线的居中长标题的论文封面一种绘图实现

引言

在一些学位论文的封面上要求标题带有下划线,但长标题的情况下标题自动换行后下划线就会面临一些问题。
因此,往往需要一些特殊的处理。
在《如何制作自动换行且有定长下划线的论文封面模板?》,
《毕业论文封面上的标题下划线处理》
《不定长, 自动换行且有定长下划线的“论文标题”》
等文章中,
提供了一些很好的思路。主要有:利用表格内容下划线结合手动的画线;根据输入文本的长度直接对该文本分行并做下划线;利用两个同位置的adjustbox一个输出文本另一个根据行距指在定位置填充线作为下滑线。

然而,这个带下划线的长标题文本实际上只是封面等页面中的一个部分,在考虑实现时需要统筹页面中的其他要素。
考虑到在一个页面中过多的使用表、图等不同元素,实际上会导致精确定位等方面存在困难。
因为,为使下划线长文本能与其他要素更统一,也为了进一步简化代码,本文提供了一种新的实现,即直接利用绘图得到页面中的所有要素,从而避免使用表格来对齐,避免使用下滑线来处理复杂的换行,避免利用vspace等来定位,使得整个实现更易理解,更便于迁移和修改。
本文中对带下划线的多行长文本的处理类似于前述的第三种思路,但是利用tikz实现。首先利用tikz的node来输出自动换行的文本,然后从node中获得位置信息后直接根据行距绘制下划线。

值得注意的是,利用tikz绘制封面是一种比较常见的方法,所以本文只说是提供一种新的实现,相当于利用绘图这种方法来解决一些特殊的问题。

下面按从简到繁的顺序来介绍:自动换行且带下划线的长标题,长标题和其他元素构成的信息表,由信息表和其他要素构成的封面。

自动换行且带下划线的长标题

其思路如前所述,利用tikz的node输出文本,node中是parbox实现对文本的自动断行,然后根据node的信息和行距绘制下划线,同时利用node的位置对齐该标题所对应的标签。

比如:

\documentclass[twoside]{article}
\usepackage{ctex}
\usepackage{CJKfntef}
\usepackage{geometry}
\geometry{a4paper,top=27mm,bottom=25.4mm,left=30mm,right=30mm}
\geometry{headheight=7.7mm,headsep=4.3mm,footskip=7.9mm}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{xcolor}

\ExplSyntaxOn

%获取node内部的文本行数存入counter:linesinnode中
\newdimen\mydimxs
\newdimen\mydimxe
\newdimen\myheight
\newcounter{linesinnode}
\NewDocumentCommand {\getnodedimen} {m} {
  \pgfextracty{\mydimxs}{\pgfpointanchor{#1}{south~west}}
  \pgfextracty{\mydimxe}{\pgfpointanchor{#1}{north~east}}
  \pgfmathsetlength{\myheight}{\mydimxe-\mydimxs+\baselineskip-0.9\ccwd}%\the\myheight
  \setcounter{linesinnode}{\numexpr\myheight/\baselineskip\relax}
}

%记录表格标签的宽度、表格中node的基点位置
\newlength\rowlabelwidth
\setlength\rowlabelwidth{69pt} %指定宽度,宽度小一点可以压缩全角冒号标点所占的空间
\def\lastrowbasepoint{\pgfpointadd{\pgfpointanchor{current~page}
{north~west}}{\pgfpoint{6.55cm}{-14cm}}}%\pgfpointorigin


\tikzstyle{multirow}=[inner~sep=0pt,minimum~width=295pt,
anchor=north~west,font=\fangsong]%draw=blue,
\tikzstyle{singlelabel}=[inner~sep=0pt,minimum~width=69pt,minimum~height=\baselineskip, text~height=\baselineskip-0.5mm,text~depth=0.1\baselineskip,anchor=north~east]
\tikzstyle{lineunderrow}=[black]

%绘制带多行文本的行
\NewDocumentCommand \nodeonepairmultirow {m m} {
    \pgfcoordinate{BasePoint}{\lastrowbasepoint}
    \node [multirow] (noderightX) at (BasePoint) {\parbox{280pt}{\centering #2}};
    \getnodedimen{noderightX}
    \foreach \x in {1,...,\thelinesinnode} {
        \draw [lineunderrow]
        ($(noderightX.south~east)+(0,\numexpr\x-1\relax\baselineskip-0.5mm)$) -- ($(noderightX.south~west)+(0,\numexpr\x-1\relax\baselineskip-0.5mm)$);
    }
    \node[inner~sep=0pt,anchor=north~east,minimum~width=69pt]  (nodeleft)  at (noderightX.north~west){\makebox[\rowlabelwidth][s]{#1}};
    \def\lastrowbasepoint{\pgfpointanchor{noderightX}{south~west}}
}
\ExplSyntaxOff

\begin{document}

\begin{tikzpicture}
\linespread{1.68}\zihao{3}\bfseries\heiti
\nodeonepairmultirow{论文题目:}
    {这是一个很长的很长的学位论文题目这是一个很长的学位论文XXX大学开题报告\LaTeX{} 模板}
\end{tikzpicture}

\end{document} 

注意其中的关键是要利用\pgfextracty获取node的上下y坐标从而确定node 的高度,进而确定其内文本的行数,从而绘制对应数量的下划线。

其结果为:
在这里插入图片描述

长标题和其他元素构成的信息表

类似的,长标题可以绘制,短标题的信息也可以采用类似的方式绘制,而且利用node之间的相互位置关系,可以让这些信息之间具有更精确的定位。

比如:

\documentclass[twoside]{article}
\usepackage{ctex}
\usepackage{CJKfntef}
\usepackage{geometry}
\geometry{a4paper,top=27mm,bottom=25.4mm,left=30mm,right=30mm}
\geometry{headheight=7.7mm,headsep=4.3mm,footskip=7.9mm}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{xcolor}

\ExplSyntaxOn

%获取node内部的文本行数存入counter:linesinnode中
\newdimen\mydimxs
\newdimen\mydimxe
\newdimen\myheight
\newcounter{linesinnode}
\NewDocumentCommand {\getnodedimen} {m} {
  \pgfextracty{\mydimxs}{\pgfpointanchor{#1}{south~west}}
  \pgfextracty{\mydimxe}{\pgfpointanchor{#1}{north~east}}
  \pgfmathsetlength{\myheight}{\mydimxe-\mydimxs+\baselineskip-0.9\ccwd}%\the\myheight
  \setcounter{linesinnode}{\numexpr\myheight/\baselineskip\relax}
}

%记录表格标签的宽度、表格中node的基点位置
\newlength\rowlabelwidth
\setlength\rowlabelwidth{69pt} %指定宽度,宽度小一点可以压缩全角冒号标点所占的空间
\def\lastrowbasepoint{\pgfpointadd{\pgfpointanchor{current~page}
{north~west}}{\pgfpoint{6.55cm}{-14cm}}}%\pgfpointorigin


\tikzstyle{multirow}=[inner~sep=0pt,minimum~width=295pt,
anchor=north~west,font=\fangsong]%draw=blue,
\tikzstyle{singlelabel}=[inner~sep=0pt,minimum~width=69pt,minimum~height=\baselineskip, text~height=\baselineskip-0.5mm,text~depth=0.1\baselineskip,anchor=north~east]
\tikzstyle{lineunderrow}=[red]
\tikzstyle{singlerow}=[inner~sep=0pt,minimum~width=295pt,minimum~height=\baselineskip, text~height=\baselineskip-0.5mm,text~depth=0.1\baselineskip,
font=\fangsong,anchor=north~west]
\tikzstyle{singleshortrow}=[inner~sep=0pt,minimum~width=112pt,
minimum~height=\baselineskip,text~height=\baselineskip-0.5mm,
text~depth=0.1\baselineskip,font=\fangsong,anchor=north~west]

%绘制带多行文本的行
\NewDocumentCommand \nodeonepairmultirow {m m} {
    \pgfcoordinate{BasePoint}{\lastrowbasepoint}
    \node [multirow] (noderightX) at (BasePoint) {\parbox{280pt}{\centering #2}};
    \getnodedimen{noderightX}
    \foreach \x in {1,...,\thelinesinnode} {
        \draw [lineunderrow]
        ($(noderightX.south~east)+(0,\numexpr\x-1\relax\baselineskip-0.5mm)$) -- ($(noderightX.south~west)+(0,\numexpr\x-1\relax\baselineskip-0.5mm)$);
    }
    \node[inner~sep=0pt,anchor=north~east,minimum~width=69pt]  (nodeleft)  at (noderightX.north~west){\makebox[\rowlabelwidth][s]{#1}};
    \def\lastrowbasepoint{\pgfpointanchor{noderightX}{south~west}}
}

%绘制带单行文本的行
\NewDocumentCommand \nodeonepairsinglerow {m m} {
    \pgfcoordinate{BasePoint}{\lastrowbasepoint}
    \node[singlerow]  (noderight) at (BasePoint)
    {\parbox{280pt}{\centering #2}};
    \draw [lineunderrow] ($(noderight.south~east)+(0,-0.5mm)$)
    -- ($(noderight.south~west)+(0,-0.5mm)$);
    \node[singlelabel]  (nodeleft)  at
    (noderight.north~west){\makebox[\rowlabelwidth][s]{#1}};
    \def\lastrowbasepoint{\pgfpointanchor{noderight}{south~west}}
}

%绘制带单行文本的行,但有两列
\NewDocumentCommand \nodedblpairsinglerow {m m m m} {
    \pgfcoordinate{BasePoint}{\lastrowbasepoint}
    \node[singleshortrow]  (noderight) at (BasePoint)
    {\parbox{105pt}{\centering #2}};
    \draw [lineunderrow] ($(noderight.south~east)+(0,-0.5mm)$) --
    ($(noderight.south~west)+(0,-0.5mm)$);
    \node[singlelabel]  (nodeleft)  at
    (noderight.north~west){\makebox[\rowlabelwidth][s]{#1}};
    \node[singlelabel,anchor=north~west]  (noderighta)
    at (noderight.north~east){\makebox[\rowlabelwidth][s]{#3}};
    \node[singleshortrow]  (noderightb) at (noderighta.north~east)
    {\parbox{105pt}{\centering #4}};
    \draw [lineunderrow] ($(noderightb.south~east)+(0,-0.5mm)$)
    -- ($(noderightb.south~west)+(0,-0.5mm)$);
    \def\lastrowbasepoint{\pgfpointanchor{noderight}{south~west}}
}
\ExplSyntaxOff

\begin{document}

\begin{tikzpicture}
\linespread{1.68}\zihao{3}\bfseries\heiti
\nodeonepairmultirow{论文题目:}
    {这是一个很长的很长的学位论文题目这是一个很长的学位论文XXX大学开题报告\LaTeX{} 模板}
\nodedblpairsinglerow{学\hspace{2em}号:}{160590XX}{姓\hspace{2em}名:}{谭同学}
\nodeonepairsinglerow{一级学科:}{控制科学与工程}
\nodeonepairsinglerow{研究方向:}{图像处理}
\nodedblpairsinglerow{指导教师:}{张老师}{职\hspace{2em}称:}{教~~授}
\nodeonepairsinglerow{学\hspace{2em}院:}{信息系统与管理学院}
\nodeonepairsinglerow{开题时间:}{2017 年 03 月 01 日}
\end{tikzpicture}

\end{document} 

这里的关键则是,不同的行之间的相互定位关系。我们使用了pgfpoint和pgfcoordinate之间的转化。
在绘制前一行后,利用pgfpoint记录后一行的定位点\lastrowbasepoint。绘制后一行时,将pgfpoint转化为pgfcoordinate来定位本行的node位置。

注意:使用\pgfpointanchor命令从节点的各个位置上取出pgfpoint,利用\pgfcoordinate从pgfpoint中取出坐标点。

其结果为:
在这里插入图片描述

由信息表和其他要素构成的封面

封面除了论文相关的信息表外,还有与机构相关的其他信息,为便于定位,而避免利用vspace等来不断调试定位,直接利用绘图定位封面内的所有要素。
注意:tikz绘图时利用精确定位,需要带选项 remember~picture,overlay。

比如:

\documentclass[twoside]{article}
\usepackage{ctex}
\usepackage{CJKfntef}
\usepackage{geometry}
\geometry{a4paper,top=27mm,bottom=25.4mm,left=30mm,right=30mm}
\geometry{headheight=7.7mm,headsep=4.3mm,footskip=7.9mm}

\renewcommand{\baselinestretch}{1.4} % line space setting
\usepackage{enumitem}
\AddEnumerateCounter{\chinese}{\chinese}{}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{xcolor}
\usepackage{ctable}

\ExplSyntaxOn

%获取node内部的文本行数存入counter:linesinnode中
\newdimen\mydimxs
\newdimen\mydimxe
\newdimen\myheight
\newcounter{linesinnode}
\NewDocumentCommand {\getnodedimen} {m} {
  \pgfextracty{\mydimxs}{\pgfpointanchor{#1}{south~west}}
  \pgfextracty{\mydimxe}{\pgfpointanchor{#1}{north~east}}
  \pgfmathsetlength{\myheight}{\mydimxe-\mydimxs+\baselineskip-0.9\ccwd}%\the\myheight
  \setcounter{linesinnode}{\numexpr\myheight/\baselineskip\relax}
}

%记录表格标签的宽度、表格中node的基点位置
\newlength\rowlabelwidth
\setlength\rowlabelwidth{69pt} %指定宽度,宽度小一点可以压缩全角冒号标点所占的空间
\def\lastrowbasepoint{\pgfpointadd{\pgfpointanchor{current~page}
{north~west}}{\pgfpoint{6.55cm}{-14cm}}}%\pgfpointorigin


\tikzstyle{multirow}=[inner~sep=0pt,minimum~width=295pt,
anchor=north~west,font=\fangsong]%draw=blue,
\tikzstyle{singlerow}=[inner~sep=0pt,minimum~width=295pt,minimum~height=\baselineskip, text~height=\baselineskip-0.5mm,text~depth=0.1\baselineskip,
font=\fangsong,anchor=north~west]
\tikzstyle{singleshortrow}=[inner~sep=0pt,minimum~width=112pt,
minimum~height=\baselineskip,text~height=\baselineskip-0.5mm,
text~depth=0.1\baselineskip,font=\fangsong,anchor=north~west]
\tikzstyle{singlelabel}=[inner~sep=0pt,minimum~width=69pt,minimum~height=\baselineskip, text~height=\baselineskip-0.5mm,text~depth=0.1\baselineskip,anchor=north~east]
\tikzstyle{lineunderrow}=[black]

%绘制带多行文本的行
\NewDocumentCommand \nodeonepairmultirow {m m} {
    \pgfcoordinate{BasePoint}{\lastrowbasepoint}
    \node [multirow] (noderightX) at (BasePoint) {\parbox{280pt}{\centering #2}};
    \getnodedimen{noderightX}
    \foreach \x in {1,...,\thelinesinnode} {
        \draw [lineunderrow]
        ($(noderightX.south~east)+(0,\numexpr\x-1\relax\baselineskip-0.5mm)$) -- ($(noderightX.south~west)+(0,\numexpr\x-1\relax\baselineskip-0.5mm)$);
    }
    \node[inner~sep=0pt,anchor=north~east,minimum~width=69pt]  (nodeleft)  at (noderightX.north~west){\makebox[\rowlabelwidth][s]{#1}};
    \def\lastrowbasepoint{\pgfpointanchor{noderightX}{south~west}}
}

%绘制带单行文本的行
\NewDocumentCommand \nodeonepairsinglerow {m m} {
    \pgfcoordinate{BasePoint}{\lastrowbasepoint}
    \node[singlerow]  (noderight) at (BasePoint)
    {\parbox{280pt}{\centering #2}};
    \draw [lineunderrow] ($(noderight.south~east)+(0,-0.5mm)$)
    -- ($(noderight.south~west)+(0,-0.5mm)$);
    \node[singlelabel]  (nodeleft)  at
    (noderight.north~west){\makebox[\rowlabelwidth][s]{#1}};
    \def\lastrowbasepoint{\pgfpointanchor{noderight}{south~west}}
}

%绘制带单行文本的行,但有两列
\NewDocumentCommand \nodedblpairsinglerow {m m m m} {
    \pgfcoordinate{BasePoint}{\lastrowbasepoint}
    \node[singleshortrow]  (noderight) at (BasePoint)
    {\parbox{105pt}{\centering #2}};
    \draw [lineunderrow] ($(noderight.south~east)+(0,-0.5mm)$) --
    ($(noderight.south~west)+(0,-0.5mm)$);
    \node[singlelabel]  (nodeleft)  at
    (noderight.north~west){\makebox[\rowlabelwidth][s]{#1}};
    \node[singlelabel,anchor=north~west]  (noderighta)
    at (noderight.north~east){\makebox[\rowlabelwidth][s]{#3}};
    \node[singleshortrow]  (noderightb) at (noderighta.north~east)
    {\parbox{105pt}{\centering #4}};
    \draw [lineunderrow] ($(noderightb.south~east)+(0,-0.5mm)$)
    -- ($(noderightb.south~west)+(0,-0.5mm)$);
    \def\lastrowbasepoint{\pgfpointanchor{noderight}{south~west}}
}

%定义两套Key-value设置,一套是NUDTlabelset,一套是NUDTvalueset
%前者用于在模板中定义,后者则作为用户接口
\NewDocumentCommand\definekey{mm}{\keys_define:nn { #1 }{#2 .tl_set:c = { l_#1_#2_tl }}}
\NewDocumentCommand\NUDTlabelset{m}{\keys_set:nn {NUDTlabel} { #1 }}
\NewDocumentCommand\NUDTvalueset{m}{\keys_set:nn {NUDTvalue} { #1 }}
\clist_const:Nn \l_NUDT_keys {author,title,author,title,schoollogo,schooltext,
proposaltype,classification,proposalnumber,authorid,major,field,advisor,
advisortitle,institute,date,formdate,mark}%在clist中定义key
\clist_map_inline:Nn \l_NUDT_keys{\definekey{NUDTlabel}{#1}}
\clist_map_inline:Nn \l_NUDT_keys{\definekey{NUDTvalue}{#1}}

%设置标签信息
\NUDTlabelset
{   author={姓\hspace{2em}名:},
    title={论文题目:},
    schoollogo={},
    schooltext={},
    proposaltype={},
    classification={密级:},
    proposalnumber={编号:},
    authorid={学\hspace{2em}号:},
    major={一级学科:},
    field={研究方向:},
    advisor={指导教师:},
    advisortitle={职\hspace{2em}称:},
    institute={学\hspace{2em}院:},
    date={开题时间:},
    formdate={二〇一八年一月},% 制表月份
    mark={}, %XXX大学研究生院制
}

%封面的命令
%注意:其中不同元素的定位根据模板的要求来设置
\NewDocumentCommand\makecover{}{
\newpage\thispagestyle{empty}\noindent
\begin{tikzpicture}[remember~picture,overlay]
  \begin{scope}
    \linespread{1.4}
    \node[anchor=center] at ($(current~page.north~west)+(5.45cm,-5.35cm)$)
        {\l_NUDTvalue_schoollogo_tl};
    \node[font=\zihao{4}\mdseries\heiti] at
        ($(current~page.north~east)+(-5.7cm,-5.5cm)$)
        {\begin{tabular}{c c}
        \l_NUDTlabel_classification_tl &   {\fangsong\l_NUDTvalue_classification_tl} \\
        \l_NUDTlabel_proposalnumber_tl &   {\fangsong\l_NUDTvalue_proposalnumber_tl} \\
       \end{tabular}};
  \end{scope}
  \begin{scope}
    \node[] at ($(current~page.north~west)+(10.5cm,-8.3cm)$)
        {\bfseries\l_NUDTvalue_schooltext_tl};
    \node[] at ($(current~page.north~west)+(10.5cm,-11.3cm)$)
       {\mdseries\fontsize{28}{12}\selectfont
       \begin{tabular}{c}
        \l_NUDTvalue_proposaltype_tl \\
        开题报告\\
       \end{tabular}};
    \linespread{1.68}\zihao{3}\bfseries\heiti
    \nodeonepairmultirow{\l_NUDTlabel_title_tl}{\l_NUDTvalue_title_tl}
    \nodedblpairsinglerow{\l_NUDTlabel_authorid_tl}
        {\l_NUDTvalue_authorid_tl}{\l_NUDTlabel_author_tl}
        {\l_NUDTvalue_author_tl}
    \nodeonepairsinglerow{\l_NUDTlabel_major_tl}
        {\l_NUDTvalue_major_tl}
    \nodeonepairsinglerow{\l_NUDTlabel_field_tl}
        {\l_NUDTvalue_field_tl}
    \nodedblpairsinglerow{\l_NUDTlabel_advisor_tl}
        {\l_NUDTvalue_advisor_tl}{\l_NUDTlabel_advisortitle_tl}
        {\l_NUDTvalue_advisortitle_tl}
    \nodeonepairsinglerow{\l_NUDTlabel_institute_tl}
        {\l_NUDTvalue_institute_tl}
    \nodeonepairsinglerow{\l_NUDTlabel_date_tl}{\l_NUDTvalue_date_tl}
    \node[] at ($(current~page.north~west)+(10.5cm,-25.5cm)$)
        {\begin{tabular}{p{400pt}<{\centering}}
        {\mdseries\l_NUDTvalue_mark_tl}  \\
        {\mdseries\l_NUDTlabel_formdate_tl}
        \end{tabular}};
  \end{scope}
\end{tikzpicture}
  \clearpage

  %%%% 说明页
  \thispagestyle{empty}
  \begin{center}
  	{\heiti \zihao{2} 说 \qquad 明}
  \end{center}
{\songti\zihao{-4}\SetEnumitemKey{noenumsep}{labelsep=0pt,topsep=0pt,partopsep=0pt,itemsep=0pt,parsep=0pt}
\begin{enumerate}[label={\chinese*、},noenumsep]
  		\item 开题报告应按下述要求打印后装订成册:
\begin{enumerate}[label={\arabic*.},noenumsep]
  			\item 	使用A4白纸,双面打印;
  			\item 	封面中填写内容使用小3号仿宋字体;
  			\item 	表中填写内容使用5号楷体字体。
  		\end{enumerate}
  		\item 封面中的编号由学院填写,采用八位数编码,前四位为审批日期,精确到年月即可,第五位为院别,后三位为审批流水号(按年)。如15016100,为6院15年审批的第100位开题申请者,审批时间为15年1月份。院别代码与编制序列一致,海洋科学与工程研究院代码为0。
  		\item 开题报告表中学员填写的内容包括学位论文选题的立论依据、文献综述、研究内容、研究条件、学位论文工作计划、主要参考文献等,指导教师认可学员开题报告内容后,对学员学位论文选题价值、对国内/外研究现状的了解情况、研究内容、研究方案等方面予以评价。
  		\item 开题报告评议小组一般由3-5名具有正高级专业技术职务的专家(包括导师)组成,其中一名为跨一级学科的专家。
		\item 若开题报告获得通过,应根据评议小组意见对开题报告进行修改,并在开题报告会后两周内,将评议表和修订后开题报告纸质版原件交学院备案;若开题报告未获得通过,则填报延期开题申请,由原开题报告评议小组重新组织开题报告会。
	\end{enumerate}}
}
\ExplSyntaxOff

\begin{document}

%设置论文信息
\NUDTvalueset
{
    author={谭同学},                % 作者
    title={这是一个很长的很长的学位论文题目这是一个很长的学位论文XXX大学开题报告\LaTeX{} 模板},                          % 论文标题
    schoollogo={\fbox{\parbox[c][2.7cm][c]{2.8cm}{\centering 某某大学logo}}},%大学logo
    schooltext={\zihao{-1}\heiti\makebox[5cm][s]{某科技大学}},%大学名
    proposaltype={\CJKunderline{博士}研究生学位论文}, % 研究生类别:硕士,博士需下划线
    classification={公开},          % 密级:公开,秘密,机密或者绝密
    proposalnumber={\underline{\makebox[1cm][c]{XXX}}},  % 编号:默认是下划线
    authorid={160590xx},            % 学号
    major={控制科学与工程},         % 一级学科
    field={图像处理},               % 研究方向
    advisor={张老师},               % 导师
    advisortitle={教~~~~授},        % 职称
    institute={信息系统与管理学院}, % 学院
    date={2017~年~03~月~01日},      % 开题日期
    mark={某科技大学研究生院制},    % 制表单位信息
}

%绘制封面
\makecover

\end{document} 

注意:其中为了方便输入信息同时减少代码,我们利用了key-value的方式来实现。

其结果为:
在这里插入图片描述在这里插入图片描述

小结

本文为一些学位论文封面设置提供了一种完全基于绘图的实现,其中实现了自动换行的带下滑线的长文本,并利用tikz的坐标定位得到精确的封面元素布局。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2159486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

决策树+随机森林模型实现足球大小球让球预测软件

文章目录 前言一、决策树是什么&#xff1f;二、数据收集与整理1.数据收集2.数据清洗3.特征选择 三、决策树构建3.1绘制训练数据图像3.2 训练决策树模型3.3 依据模型绘制决策树的决策边界3.4 树模型可视化 四、模型预测五、随机森林模型总结 前言 之前搞足球数据分析的时候&…

删除topic提示admin token

这个admin token不是admin的密码&#xff0c;而是如下配置文件中的值&#xff1a; 否则报错&#xff1a; 检查&#xff1a; [rootk1 conf]# pwd /opt/kafka-web/efak-web-3.0.1/conf [rootk1 conf]# grep token system-config.properties # delete kafka topic token efak.t…

教师管理系统小程序+ssm论文源码调试讲解

第二章 开发工具及关键技术介绍 2.1 JAVA技术 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterrise JavaBeans&#xff09;的全面支持&#xff0c;java servlet AI&#xff0c;JS&#xff08;java server ages&…

TCL25届校招测评笔试TAS人才测评题库:高分攻略真题分析

&#x1f31f; 职场新人必看&#xff1a;TCL校招测评全解析 &#x1f31f; 亲爱的小伙伴们&#xff0c;你是否正准备踏入职场&#xff0c;或是对即将到来的校招感到既兴奋又紧张&#xff1f;今天&#xff0c;我将带你深入了解TCL校招中的TAS人才测评&#xff0c;让你在面试前做…

Flutter鸿蒙化环境配置(windows)

Flutter鸿蒙化环境配置&#xff08;windows&#xff09; 参考资料Window配置Flutter的鸿蒙化环境下载配置环境变量HarmonyOS的环境变量配置配置Flutter的环境变量Flutter doctor -v 检测的问题flutter_flutter仓库地址的警告问题Fliutter doctor –v 报错[!] Android Studio (v…

构建数据分析模型,及时回传各系统监控监测数据进行分析反馈响应的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。增…

20 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示&#xff0c;设置电流阈值为80&#xff0c;电流小阈值为50&#xff0c;电压阈值为60&#xff0c;温度阈值…

虚幻引擎的射线检测/射线追踪

射线检测在 FPS/TPS 游戏中被广泛应用 什么是射线检测? 两个点行成一条线 , 射线检测是从一个起始点发出一条到终点的射线 , 如果射线命中一个游戏对象&#xff0c;就可以获取到对象命中时的 位置、距离、角度、是否命中、骨骼 等非常多的信息 , 这些信息在射击游戏中至关重…

价格便宜又好用的云电脑挑选:ToDesk云电脑 vs 青椒云

云计算技术的成熟使得云电脑因其便捷、灵活和高效而成为日常工作、学习和娱乐的首选工具。而在众多云电脑品牌之中&#xff0c;ToDesk云电脑与青椒云电脑 较为热门 。在此&#xff0c;笔者将围绕价格、性能、用户体验等关键指标对 比 这两款云电脑&#xff0c; 帮助 你们 找到最…

信号分解降噪 | Matlab实现基于TVFEMD-IMF能量熵增量的数据降噪方法

信号分解降噪 | Matlab实现基于TVFEMD-IMF能量熵增量的数据降噪方法 目录 信号分解降噪 | Matlab实现基于TVFEMD-IMF能量熵增量的数据降噪方法效果一览基本介绍程序设计参考资料 效果一览 基本介绍 信号分解降噪 | Matlab实现基于TVFEMD-IMF能量熵增量的数据降噪方法。该方法引…

地平线静态目标检测 MapTR 参考算法-V1.0

简介 高清地图是自动驾驶系统的重要组件&#xff0c;提供精确的驾驶环境信息和道路语义信息。传统离线地图构建方法成本高&#xff0c;维护复杂&#xff0c;使得依赖车载传感器的实时感知建图成为新趋势。早期实时建图方法存在局限性&#xff0c;如处理复杂地图元素的能力不足…

【python】requests 库 源码解读、参数解读

文章目录 一、基础知识二、Requests库详解2.1 requests 库源码简要解读2.2 参数解读2.3 处理响应2.4 错误处理 一、基础知识 以前写过2篇文章&#xff1a; 计算机网络基础&#xff1a; 【socket】从计算机网络基础到socket编程——Windows && Linux C语言 Python实现…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【LMS调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 LMS全称为Lite Memory Sanitizer&#xff0c;是一种实时…

新版本大疆上云API指令飞行(drc)模式通讯搭建思路

一、大疆上云API mqtt官方通讯指导 1.1drc链路 1.2mqtt交互时序图 二、自行搭建mqtt说明 2.1工具&#xff1a;用emqx搭建mqtt服务器&#xff0c;mqttx作为客户端测试工具 2.2端口说明&#xff1a;1883&#xff0c;普通mqtt消息端口&#xff0c;8083&#xff0c;ws通信协议端…

商业银行应用安全架构设计实践

传统的信息安全工作通常偏向于事中或事后检测漏洞,随着敏捷开发工作的逐步推进,商业银行认识到安全架构设计在实现IT降本增效方面的独特优势。近几年,商业银行逐步构建了安全架构设计工作体系,在组织人员、安全技术与管控流程方面,与企业IT架构密切协同,着力建设安全公共…

课程表-LeetCode100

现在你总共有 numCourses 门课需要选&#xff0c;记为 0 到 numCourses - 1。给你一个数组 prerequisites &#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示在选修课程 ai 前 必须 先选修 bi 。 例如&#xff0c;想要学习课程 0 &#xff0c;你需要先完成课程 1…

Python | Leetcode Python题解之第432题全O(1)的数据结构

题目&#xff1a; 题解&#xff1a; class Node:def __init__(self, key"", count0):self.prev Noneself.next Noneself.keys {key}self.count countdef insert(self, node: Node) -> Node: # 在 self 后插入 nodenode.prev selfnode.next self.nextnode.…

【机器学习】——支持向量机

文章目录 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;概述SVM 的工作原理线性不可分数据&#xff1a;软间隔与核技巧SVM 的数学形式SVM 的优势SVM 的缺点SVM 的应用 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;概述 支持向量机&#…

JavaSE高级(3)——lombok、juint单元测试、断言

一、lombok的使用 默认jvm不解析第三方注解&#xff0c;需要手动开启 链式调用 二、juint单元测试 下载juint包 public class TestDemo {// 在每一个单元测试方法执行之前执行Beforepublic void before() {// 例如可以在before部分创建IO流System.out.println("befor…

荣耀手机AI搜索革新体验:一键总结归纳,让信息获取更高效

在信息爆炸的时代&#xff0c;我们每天都被海量的数据包围&#xff0c;如何快速、准确地获取所需信息成为了现代人的一大挑战。 近日&#xff0c;荣耀手机宣布其AI搜索功能正式上线&#xff0c;这一创新举措不仅为使用者带来了前所未有的便捷体验&#xff0c;更在智能手机领域…