The points are in the margin, it turns out. The problem is that questions doesn't expect a label as wide as yours, so the label protrudes into the left margin i.e. it is the label which needs fixing (or, rather, the space allowed for it) rather than the location of the points per se.
I used geometry with pass,showframe to confirm this in testing. I've left this commented in the code below.
I defined a new command to make things easier, though it doesn't do much.
\mkquestionlabel[<label>](<punctuation>){<content>} takes 2 optional and 1 mandatory argument. By default, it reproduces your format with a bold Problem, a non-breakable space, the number or title and a full-stop.
We can then use this to adjust the width allowed for labels in the questions environment by defining a \widestquestionlabel. I used 99 as the dummy content here. Obviously, adjust this as necessary.
\newcommand {\widestquestionlabel} {\mkquestionlabel{99}}
We can then use the \questionshook facility to adjust the space left for the label.
\renewcommand \questionshook {% mod from pkg code \settowidth{\leftmargin}{\widestquestionlabel \hskip\labelsep}% }
This produces hanging items i.e. the label is wider than the standard indentation of the list. If you want the content indented by the entire width of the label, you could use
\renewcommand \questionshook {% mod from pkg code \settowidth{\leftmargin}{\widestquestionlabel \hskip\labelsep}% \labelwidth\leftmargin\advance\labelwidth-\labelsep }
But this will lead to a lot of white space on the left if you have long labels.
Complete code:
\documentclass [addpoints, letterpaper, 12pt] {exam} % \usepackage[pass,showframe]{geometry} \NewDocumentCommand \mkquestionlabel { O {Problem~} D () {.} m } {% #1 prefix #2 suffix #3 number/title \textbf{#1}#3#2% } \renewcommand {\questionlabel} {\mkquestionlabel{\thequestiontitle}} \newcommand {\widestquestionlabel} {\mkquestionlabel{99}} \bracketedpoints \pointsinmargin \renewcommand \questionshook {% mod from pkg code % % We use the default definition of \makelabel % % so as not to interfere with \qformat commands. % % \def\makelabel##1{\hss\llap{##1}}% % \settowidth{\leftmargin}{10.\hskip\labelsep}% % \labelwidth\leftmargin\advance\labelwidth-\labelsep % \partopsep=0pt % \questionshook \settowidth{\leftmargin}{\widestquestionlabel \hskip\labelsep}% } \begin {document} \begin {questions} \question [20] Some text. \end {questions} \end {document}
EDIT
The space for marginal notes is on the right but, if you nonetheless wish to push the points into the left margin, you can do it. However, you need to use \pointsformat and add the square brackets yourself.
The following seems to work.
\documentclass [addpoints, letterpaper, 12pt] {exam} % ateb: https://tex.stackexchange.com/a/717305/ \usepackage[pass,showframe]{geometry} \usepackage{calc} \usepackage{kantlipsum}% don't use in your real document \newlength \qnlabelwidth \qnlabelwidth=0pt \NewDocumentCommand \mkquestionlabel { O {Problem~} D () {.} m } {% #1 prefix #2 suffix #3 number/title \textbf{#1}#3#2% } \NewDocumentCommand \mkquestionlabelbox { m } {% \makebox[\qnlabelwidth] {% \mkquestionlabel{#1}\hfill }% } \renewcommand {\questionlabel} {% \mkquestionlabelbox{\thequestiontitle}% } \AddToHook{begindocument/end} {% \settowidth \qnlabelwidth {% \mkquestionlabel{99}% }% } \bracketedpoints \pointsinmargin \pointformat{\llap{[\themarginpoints] \hspace*{\qnlabelwidth}}} \renewcommand \questionshook {% mod from pkg code % % We use the default definition of \makelabel % % so as not to interfere with \qformat commands. % % \def\makelabel##1{\hss\llap{##1}}% % \settowidth{\leftmargin}{10.\hskip\labelsep}% % \labelwidth\leftmargin\advance\labelwidth-\labelsep % \partopsep=0pt % \questionshook \itemindent=\qnlabelwidth \advance \itemindent by \labelsep \leftmargin=0pt \labelwidth=\qnlabelwidth } \begin {document} \begin {questions} \question [20] \thepoints \kant[1] \end {questions} \end {document}
Apologies for the lack of a picture. Okular-on-X has a bug which means my PDFs are fine, but images cropped from them or produced by conversion are worthless.
EDIT
Attempt at picture:
