如何控制 \makebox 后的空格

如何控制 \makebox 后的空格

此 MWE 是考试的一部分。在每个问题之前,我都会在左边空白处放置一个方框,其中包含问题编号和最高分数。

仅针对这个 MWE,我将 改为\makebox\framebox强调下面的问题。

问题本身(内容)应该从左边距的末尾开始,也就是在前一段的开头下方。我有两个问题:

  1. 该盒子似乎比我预期的占用更多空间:1.7厘米

  2. 盒子周围似乎有一些空间,这是我不想要的。

显然,我试图用负数来补偿它\hspace,但在更复杂的实际考试中,这种补偿会采取不同的值,所以你需要不断调整。

如何让盒子的尺寸正好是 1.7 厘米而不是更大,以及如何让盒子和后续文本之间不留空格/粘连或其他任何东西?

\documentclass[12pt,a4paper,notitlepage]{report}
\usepackage[left=25mm,right=25mm,top=15mm,height=252mm,includefoot]{geometry}
\usepackage{showframe}              % temporary, to emphasize my point !
\usepackage{xifthen}                % conditionals, booleans

\setlength{\parindent}{0mm}         % no paragraph indentation

\newcounter{countSubExercises}      % number of sub level exercises: a,b,c,...

\newlength{\boxWidth}             
\setlength{\boxWidth}{1.7cm}

\newcommand{\newSubEx}[2]
%   #1 = no. of score pts
%   #2 = content
{
    \refstepcounter{countSubExercises}  % increment subEx counter
    % box with question nr and max score in the left margin
    \hspace*{-\boxWidth}                        
    \framebox[\boxWidth][r]{{\tiny\sl #1p}\enspace{\bf\alph{countSubExercises}}\enspace}
    #2\\
}

\begin{document}
\chapter*{Exercise title}
A first instructive paragraph\\
\newSubEx{2}{Comment on blah blah ...}
\\
\\
A second instructive paragraph\\
\newSubEx{4}{Calculate the perimeter of ...}
\end{document}

答案1

由于您似乎想要一个 1.7 厘米宽的框,我猜标签(点和字母)应该从左边距 1.7 厘米处开始。因此,您需要将一个 1.7 厘米宽的左对齐框嵌套到一个零宽度的右对齐框中。

我还添加了另一个框以使字母对齐,以补偿两位数的分数。

小心定义中的未受保护的空格!并且不要将其用作\\结束行/段落的正常方式。

\documentclass[12pt,a4paper,notitlepage]{report}
\usepackage[left=25mm,right=25mm,top=15mm,height=252mm,includefoot]{geometry}
\usepackage{showframe}              % temporary, to emphasize my point !
\usepackage{xifthen}                % conditionals, booleans

\setlength{\parindent}{0mm}         % no paragraph indentation

\newcounter{countSubExercises}      % number of sub level exercises: a,b,c,...

\newlength{\boxWidth}             
\setlength{\boxWidth}{1.7cm}

\newcommand{\newSubEx}[2]{%
  %   #1 = no. of score pts
  %   #2 = content
  \par\medskip
  \refstepcounter{countSubExercises}% increment subEx counter
  % box with question nr and max score in the left margin
  \makebox[0pt][r]{%
    \framebox[\boxWidth][l]{% <-------------- change to \makebox
      \makebox[1.2em][l]{\tiny\slshape #1p}%
      \enspace
      \textbf{\alph{countSubExercises}}%
      \enspace
    }%
  }%
  #2%
}

\begin{document}
\chapter*{Exercise title}
A first instructive paragraph

\newSubEx{2}{Comment on blah blah ...}

\bigskip

A second instructive paragraph

\newSubEx{4}{Calculate the perimeter of ...}

\bigskip

A third instructive paragraph

\newSubEx{12}{Calculate the perimeter of ...}
\end{document}

在此处输入图片描述

答案2

你可以这样做\llap

\documentclass[12pt,a4paper,notitlepage]{report}
\usepackage[left=25mm,right=25mm,top=15mm,height=252mm,includefoot]{geometry}
\usepackage{showframe} % temporary, to emphasize my point !
\usepackage{xifthen} % conditionals, booleans

\setlength{\parindent}{0mm} % no paragraph indentation

\newcounter{countSubExercises} % number of sub level exercises: a,b,c,...

\newlength{\boxWidth}
\setlength{\boxWidth}{1.7cm}

\newcommand{\newSubEx}[2]
% #1 = no. of score pts
% #2 = content
{
    \refstepcounter{countSubExercises} % increment subEx counter
    % box with question nr and max score in the left margin
  \leavevmode
  \llap{\framebox[\boxWidth][r]{{\tiny\sl #1p}\enspace{\bf\alph{countSubExercises}}\enspace}}%
    #2\\
}

\begin{document}

\chapter*{Exercise title}
A first instructive paragraph

\newSubEx{2}{Comment on blah blah ...}
\\
\\
A second instructive paragraph

\newSubEx{4}{Calculate the perimeter of ...}

\end{document} 

在此处输入图片描述

答案3

把它封闭起来\makebox[0pt][r]{..}似乎可以起到作用。

\newcommand{\newSubEx}[2]{\refstepcounter{countSubExercises}%
  \makebox[0pt][r]{\framebox[\boxWidth][r]{{\tiny\sl#1p}\enspace{\bfseries
  \alph{countSubExercises}}\enspace}}#2\\\relax}

无论如何,我认为有更清洁的选择,更少\\

嗯……或者你只是需要%像 Werner 说的那样……我不确定我是否理解了这个问题。如果这不能满足你的需要,请告诉我,我会删除答案。

相关内容