为什么如果我使用\documentclass{book}
以下代码作为示例,代码可以工作,而如果我使用,classicthesis
就会出错?抱歉篇幅太长,但这就是 MWE。
在示例中\textwidth
,应用了 found,don't,因此我认为与边距相关的内容与错误无关。对我来说,问题出在 .aux 文件上。
\documentclass{scrreprt}
\usepackage[%
pdfspacing,%
linedheaders,%
]{classicthesis}
\usepackage{pgf}
\usepackage{xparse}
\usepackage{siunitx}
\usepackage{environ}
\usepackage{booktabs}
\usepackage{amsmath,amssymb,amsthm,amsfonts}
% 1 comment this: \input{\nameofthisfile.aux} line
% 2 compile
% 3 uncomment this: \input{\nameofthisfile.aux} line
% 4 compile
% put here the name of this .tex file
\newcommand{\nameofthisfile}{testing}
\ExplSyntaxOn
\bool_new:N \g_has_run_bool
\tl_new:N \l_aw_text_tl
\int_new:N \l_aw_tot_int
\int_new:N \g_aw_tot_alph_int
\int_new:N \g_wid_space_int
\int_new:N \g_space_int
\fp_new:N \g_rat_space_int
\fp_new:N \g_aw_avg_width_fp
\dim_new:N \myalphabetwidth
\dim_new:N \mytextwidth
\input{\nameofthisfile.aux} % THIS LINE
\tl_const:Nn \c_aw_the_alphabet_tl {abcdefghijklmnopqrstuvwxyz}
% this can be changed to an evironment or renamed or whatever
\NewDocumentCommand {\avgwidthstart} {}
{
\aw_avg_width:w
}
\NewDocumentCommand {\avgwidthend}{}{}
% Here is the environment version, using just "text" as a name is probably a bad idea.
\NewEnviron{avgtext}
{
\expandafter\avgwidthstart\BODY\avgwidthend
}
\makeatletter
\cs_new:Npn \aw_avg_width:w #1 \avgwidthend
{
% if first run, then generate variables to be used
\bool_if:NF \g_has_run_bool
{
\tl_map_inline:Nn \c_aw_the_alphabet_tl
{
\int_new:c {g_##1_int}
\fp_new:c {g_rat_##1_fp}
\fp_new:c {g_wid_##1_fp}
}
}
\tl_set:Nn \l_aw_text_tl {#1}
% this can be used rather than the preceding line to take capital
% letters into account, but is Slooooooow
%\tl_set:Nx \l_aw_text_tl {\tl_expandable_lowercase:n {#1}}
\int_set:Nn \l_aw_tot_int {\tl_count:N \l_aw_text_tl}
\tl_map_function:NN \c_aw_the_alphabet_tl \aw_get_counts:n
\deal_with_spaces:n {#1}
\tl_map_function:NN \c_aw_the_alphabet_tl \aw_calc_ratios:n
\tl_map_function:NN \c_aw_the_alphabet_tl \aw_calc_avg_width:n
\fp_gset_eq:NN \g_aw_avg_width_fp \l_tmpa_fp
\fp_zero:N \l_tmpa_fp
% the dimension \myalphabetwidth gives the width of the alphabet based on your character freq,
% can be accessed by \the\myalphabetwidth
\dim_gset:Nn \myalphabetwidth {\fp_to_dim:n {\fp_eval:n {26*\g_aw_avg_width_fp}}}
% the dimension \mytextwidth gives the recommended \textwidth based on 66 chars per line.
% can be accessed by \the\mytextwidth
\dim_gset:Nn \mytextwidth {\fp_to_dim:n {\fp_eval:n {66*\g_aw_avg_width_fp}}}
\protected@write\@mainaux{}{\mytextwidth=\the\mytextwidth}
\bool_gset_true:N \g_has_run_bool
% and lastly print the content
#1
}
\makeatother
\cs_new:Npn \aw_get_counts:n #1
{
% make a temporary token list from the document body
\tl_set_eq:NN \l_tmpb_tl \l_aw_text_tl
% remove all occurrences of the character
\tl_remove_all:Nn \l_tmpb_tl {#1}
% add to appropriate int the number of occurrences of that character in current block
\int_set:Nn \l_tmpa_int {\int_eval:n{\l_aw_tot_int -\tl_count:N \l_tmpb_tl}}
% add to appropriate int the number of occurrences of that character in current block
\int_gadd:cn {g_#1_int} {\l_tmpa_int}
% add this to the total
\int_gadd:Nn \g_aw_tot_alph_int {\l_tmpa_int}
}
\cs_new:Npn \deal_with_spaces:n #1
{
\tl_set:Nn \l_tmpa_tl {#1}
% rescan body with spaces as characters
\tl_set_rescan:Nnn \l_tmpb_tl {\char_set_catcode_letter:N \ }{#1}
% find number of new characters introduced. add to number of spaces and alph chars
\int_set:Nn \l_tmpa_int {\tl_count:N \l_tmpb_tl -\tl_count:N \l_tmpa_tl}
\int_gadd:Nn \g_space_int {\l_tmpa_int}
\int_gadd:Nn \g_aw_tot_alph_int {\l_tmpa_int}
% since this comes after the rest of chars are dealt with, tot_alph is final total
\fp_set:Nn \g_rat_space_fp {\g_space_int/\g_aw_tot_alph_int}
% get width of space and use it. obviously space is stretchable, so i'll assume
% that the expansions and contractions cancel one another over large text. is this
% a terrible assumption???
\hbox_set:Nn \l_tmpa_box {\ }
\fp_gset:Nn \g_wid_space_fp {\dim_to_fp:n {\box_wd:N \l_tmpa_box}}
\fp_add:Nn \l_tmpa_fp {\g_wid_space_fp*\g_rat_space_fp}
}
\cs_new:Npn \aw_calc_ratios:n #1
{
% divide number of occurrences of char by total alphabetic chars
\fp_gset:cn {g_rat_#1_fp}{{\int_use:c {g_#1_int}}/\g_aw_tot_alph_int}
}
\cs_new:Npn \aw_calc_avg_width:n #1
{
% only need to find char widths once
\bool_if:NF \g_has_run_bool
{
% find width of char box
\hbox_set:Nn \l_tmpa_box {#1}
\fp_gset:cn {g_wid_#1_fp}{\dim_to_fp:n {\box_wd:N \l_tmpa_box}}
}
% multiply it by char frequency and add to avg width
\fp_add:Nn \l_tmpa_fp {{\fp_use:c {g_wid_#1_fp}}*{\fp_use:c {g_rat_#1_fp}}}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This part is just for fun. Delete it and the showtable command from the document if
% it isn't wanted
\newlength{\alphabet}%
\settowidth{\alphabet}{\normalfont abcdefghijklmnopqrstuvwxyz}%
\tl_new:N \l_aw_tab_rows_tl
\seq_new:N \g_aw_theor_rats_seq
\seq_new:N \g_aw_the_alphabet_seq
\seq_gset_split:Nnn \g_aw_theor_rats_seq {,}
{0.0651738,0.0124248,0.0217339,0.0349835,0.1041442,0.0197881,0.0158610,0.0492888,0.0558094,0.0009033,0.0050529,0.0331490,0.0202124,0.0564513,0.0596302,0.0137645,0.0008606,0.0497563,0.0515760,0.0729357,0.0225134,0.0082903,0.0171272,0.0013692,0.0145984,0.0007836,0.1918182}
\NewDocumentCommand {\showtable}{}
{
\clearpage
\aw_make_table:
}
\cs_generate_variant:Nn \seq_set_split:Nnn {NnV}
\cs_new:Npn \aw_make_table:
{
\thispagestyle{empty}
\seq_set_split:NnV \g_aw_the_alphabet_seq {} \c_aw_the_alphabet_tl
%takes corresponding letter/theoretical ratio pairs from sequences and applies function
\seq_mapthread_function:NNN \g_aw_the_alphabet_seq \g_aw_theor_rats_seq \aw_generate_row:nn
\begin{center}
Total\,characters\,=\,\fp_eval:n {\g_aw_tot_alph_int}
\end{center}
\begin{table}[h]
\centering
\sisetup{round-mode = places,round-precision = 5,output-decimal-marker={,},table-format = 3.5}
\begin{tabular}{llll}
\toprule
{Average\,\texttt{\textbackslash textwidth}}&{Average\,character\,width}&{Average\,alphabet\,width}&{Alphabet\,width}\\
\midrule
\the\mytextwidth&\fp_eval:n {round(\g_aw_avg_width_fp,5)}pt&\the\myalphabetwidth&\the\alphabet\\
\bottomrule
\end{tabular}\par
\end{table}
\vfil
\begin{equation*}
\begin{split}
\,\texttt{\textbackslash textwidth}&=\frac{\fp_eval:n {\g_aw_tot_alph_int}\cdot \fp_eval:n {round(\g_aw_avg_width_fp,5)}\mathrm{pt}}{\fp_eval:n {\g_aw_tot_alph_int}/66}=\fp_eval:n {\g_aw_tot_alph_int*{round(\g_aw_avg_width_fp,5)}/({\g_aw_tot_alph_int}/66)}\mathrm{pt}\\
\\1
\mathrm{Total\,line\,type}&=\frac{\fp_eval:n {\g_aw_tot_alph_int}\cdot \fp_eval:n {round(\g_aw_avg_width_fp,5)}\mathrm{pt}}{\fp_eval:n {\g_aw_tot_alph_int*{round(\g_aw_avg_width_fp,5)}/({\g_aw_tot_alph_int}/66)}\mathrm{pt}}=\fp_eval:n {\g_aw_tot_alph_int/66}\\
\\
\mathrm{Characters\,for\,line\,type}&=\frac{\fp_eval:n {round(\g_aw_avg_width_fp,5)}\mathrm{pt}}{\fp_eval:n {\g_aw_tot_alph_int*{round(\g_aw_avg_width_fp,5)}/({\g_aw_tot_alph_int}/66)}\mathrm{pt}}=\fp_eval:n {\fp_eval:n {(\g_aw_tot_alph_int*{round(\g_aw_avg_width_fp,5)}/({\g_aw_tot_alph_int}/66))/round(\g_aw_avg_width_fp,5)}}
\end{split}
\end{equation*}
\vfil
\begin{table}[h]
\centering
\sisetup{round-mode = places,round-precision = 5,output-decimal-marker={,},table-format = 3.5}
\begin{tabular}{cSSS}
\toprule
{Letter}&{Actual}&{Theoretical}&{Difference}\\
\midrule
spaces&\fp_eval:n {\g_rat_space_fp*100}\%&19.18182\%&\fp_eval:n {{\g_rat_space_fp*100-19.18182}}\%\\
\tl_use:N \l_aw_tab_rows_tl
\bottomrule
\end{tabular}\par
\end{table}
}
\cs_new:Npn \aw_generate_row:nn #1#2
{
\tl_put_right:Nn \l_aw_tab_rows_tl {#1&}
\tl_put_right:Nx \l_aw_tab_rows_tl {\fp_eval:n {100*{\fp_use:c {g_rat_#1_fp}}}\%&}
\tl_put_right:Nn \l_aw_tab_rows_tl {\fp_eval:n{100*{#2}}\%&}
\tl_put_right:Nx \l_aw_tab_rows_tl {\fp_eval:n {{\fp_use:c {g_rat_#1_fp}*100-\fp_eval:n {#2}*100}}\%}
\tl_put_right:Nn \l_aw_tab_rows_tl {\\}
}
\ExplSyntaxOff
\begin{document}
\avgwidthstart
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean faucibus luctus diam, id convallis mauris faucibus ut. Aenean accumsan dignissim posuere. Praesent et diam nec est lobortis faucibus. Fusce sit amet placerat velit. Curabitur tortor velit, imperdiet imperdiet condimentum in, blandit ac augue. In vulputate volutpat ligula, malesuada porta mi eleifend at. Praesent ut augue vel nulla molestie ornare ac a sem. Donec luctus volutpat ipsum sed consectetur. Maecenas at lacus a tortor congue blandit. Vestibulum elementum risus dapibus sem blandit adipiscing. Pellentesque vulputate ullamcorper vulputate. In suscipit facilisis libero.
\avgwidthend
\showtable{}
\end{document}
答案1
真正的问题是在.aux
你输入的文件。你会发现类似这样的命令
\providecommand\hyper@newdestlabel[2]{}
\@writefile{toc}{\vspace {-\cftbeforechapskip }}
\@writefile{lof}{\deactivateaddvspace }
\@writefile{lot}{\deactivateaddvspace }
这意味着该.aux
文件需要@
是一封信件。
之前向上移动\makeatletter
(无论如何你都在使用它)\input{\nameofthisfile.aux}
会使错误消失。
顺便说一下,\jobname
由系统设置为输入文件的名称。