Resolvi meu problema de alguma forma, mas analisando por que as coisas estão se comportando dessa maneira. A questão está relacionada aos processos de compilação, então não acho que um MWE seja realmente necessário, mas forneci um no final, apenas para garantir. Este post acabou ficando bem longo, desculpe antecipadamente pela história, mas parece relevante para como cheguei ao meu dilema atual.
Contexto: Estou tentando projetar um "gerador de exame" através de python que pega uma biblioteca de perguntas, uma seleção do tipo de perguntas a serem incluídas e quanto tempo o exame deve durar, e então cria o exame e as soluções selecionando perguntas que corresponder aos critérios e importá-los para um documento xelatex. Em seguida, ele compila o documento para o usuário para que ele tenha o PDF pronto para uso.
A maior parte do documento é criada sem problemas - no entanto, criei uma série de grades para muitas questões usando o Tikz. Ao executar todas as perguntas no verso e no TeXstudio, as grades ficam exatamente como eu quero. No entanto, ao executar o programa python, eles parecem estar sendo criados em algum lugar do cabeçalho.
O processo que executei para conseguir isso é:
xelatex Exam_Qs.tex
Para tentar corrigir isso, copiei o processo que o TeXstudio estava usando e comecei a executar isto:
xelatex.exe -synctex=1 -interaction=nonstopmode "Exam_Qs".tex
Isso faz com que as grades sejam exibidas na página correta, mas agora às vezes elas são deslocadas. A experimentação sugere que um deles sempre será exibido corretamente, mas não é consistente qual é. Normalmente uso apenas IDEs, por isso não me sinto confortável em executar o processo de maneira diferente. Meu entendimento é que o modo nonstop diz ao mecanismo TeX para executar erros anteriores o máximo que puder, e que a opção synctex permite que o IDE correlacione a origem e a posição do PDF. Tenho certeza de que a opção synctex não está fazendo muito para o propósito final pretendido, mas quando as coisas não estavam funcionando, fazia sentido copiar totalmente o processo do TeXstudio.
O que realmente me confunde é que executar o processo diretamente ou dentro do TeXstudio deve produzir, pelo menos na minha opinião, o mesmo documento. No entanto, compilar o mesmo documento .tex no TeXstudio produz a grade como eu espero que pareça TODAS as vezes, enquanto chamar o processo em python parece fazer com que pareça errado TODAS as vezes, e sempre de maneiras diferentes.
Depois de digitar tudo isso e recriar meus problemas para poder descrevê-los completamente, acabei fazendo com que o python executasse o processo apenas duas vezes e - vejam só - as grades estão aparecendo exatamente como eu esperava. Então, finalmente, minhas perguntas:
Por que executar o processo duas vezes faz com que o documento seja exibido corretamente/por que executar o processo uma vez faz com que o documento não seja exibido corretamente.
Posso modificar o processo que estou chamando para não precisar chamá-lo duas vezes?
Alguns MWEs das grades que estou fazendo:
\documentclass[11pt,twoside,a4paper]{article}
\usepackage[margin=2cm, headheight=1.25cm, headsep=0.5cm]{geometry}
\usepackage{tikz} % for creating pictures using tikzpicture
\begin{document}
\begin{tikzpicture}[remember picture,overlay]
\label{grid}
% Define the size of the grid squares
\def\minorsize{2mm} % Minor grid size
\def\majorsize{1cm} % Major grid size
% Calculate the adjusted positions for the grid
\path (current page.south west) ++(20mm,23mm) coordinate (grid sw); % bottom left point
\path (current page.north east) ++(-20mm,-23.8mm) coordinate (grid ne); % top right point
% Draw the minor grid
\draw[black!20, step=\minorsize] (grid sw) grid (grid ne);
% Draw the major grid
\draw[black!50, step=\majorsize] (grid sw) grid (grid ne);
\end{tikzpicture}\newpage
\vspace{10mm}\begin{tikzpicture}[remember picture, overlay]
\label{grid}
% Define the size of the grid squares
\def\minorsize{2mm} % Minor grid size
\def\majorsize{1cm} % Major grid size
% Calculate the adjusted positions for the grid
\path (current page.south west) ++(20mm,25.8mm) coordinate (grid sw); % bottom left point
\path (current page.north east) ++(-20mm,-41mm) coordinate (grid ne); % top right point
% Draw the minor grid
\draw[black!20, step=\minorsize] (grid sw) grid (grid ne);
% Draw the major grid
\draw[black!50, step=\majorsize] (grid sw) grid (grid ne);
\end{tikzpicture}\newpage
\begin{tikzpicture}[remember picture, overlay]
\label{grid}
% Define the size of the grid squares
\def\minorsize{2mm} % Minor grid size
\def\majorsize{1cm} % Major grid size
% Calculate the adjusted positions for the grid
\path (current page.south west) ++(20mm,123mm) coordinate (grid sw); % bottom left point
\path (current page.north east) ++(-20mm,-23.8mm) coordinate (grid ne); % top right point
% Draw the minor grid
\draw[black!20, step=\minorsize] (grid sw) grid (grid ne);
% Draw the major grid
\draw[black!50, step=\majorsize] (grid sw) grid (grid ne);
\end{tikzpicture}\vspace{153mm}
\end{document}
(Não espero que as configurações de espaço ou geometria afetem o problema que estou tendo, mas incluí caso seja para isso que está voltando)