Использование newenvironment в rmarkdown

#r-markdown #newenvironment

#Латекс #r-markdown

Вопрос:

Я пытаюсь создать среду в стиле кодовой книги в документе Rmarkdown, как показано ниже:

 ---
title: "Title"
author: "Author"
date: "`r Sys.Date()`"
output:
  pdf_document:
    fig_caption: yes
    fig_crop: yes
    keep_tex: no
    number_sections: yes
    citation_package: biblatex
  html_document:
    df_print: paged
header-includes:
- usepackage[english]{babel}
- usepackage[utf8]{inputenc}
- usepackage{amsmath}
- usepackage{graphicx}
- usepackage{caption}
- usepackage{physics}
- usepackage{float}
- usepackage{tocloft}
- usepackage{inputenc}
- usepackage{setspace}
- usepackage{tabularx}
- usepackage{lipsum}
- usepackage{listings}
- usepackage{wrapfig}
- usepackage{mathtools}
- usepackage{lscape}
- usepackage{rotating}
- usepackage{epstopdf}
- usepackage{hyperref}
- geometry{letterpaper, portrait, margin=1in}
- hypersetup{colorlinks = false, linkbordercolor = {white}, citebordercolor = {white},
  urlbordercolor = {white}}
- lstset{language=R, basicstyle=smallttfamily,stringstyle=color{DarkGreen},otherkeywords={0,1,2,3,4,5,6,7,8,9},morekeywords={TRUE,FALSE},deletekeywords={data,frame,length,as,character}, keywordstyle=color{blue}, commentstyle=color{DarkGreen}}
fontsize: 14pt
---

pagenumbering{arabic}

doublespacing

newpage

Defining function here:

newlengthcbl
newenvironment{codebook}[1][]{
    settowidth{cbl}{#1}
    parskip1em plus .3em minus .2em
    parindent0pt
    defcode##1##2{{bfseries ##1}hfill
        parbox[t]{dimexprlinewidth-15em-cbl}{##2}par}}{noindent}

newpage

singlespacing

Testing out the environment here: 

subsubsection{Codebook}
    
begin{codebook}
  code{country}{Country name.}
  code{year}{Year of country observation.}
  code{codename}{Country code (character).}
  code{codenumber}{Country code (numeric).}
end{codebook}
  

Я подтвердил, что newenvironment код корректно работает в TeXstudio, но когда я пытаюсь связать этот документ в формате PDF, я получаю следующую ошибку:

 ! Undefined control sequence.
<argument> code
  

Я предполагаю, что в newenvironment команде есть что-то, что плохо работает с синтаксисом rmarkdown. Любая помощь будет оценена.

Ответ №1:

Если вы установите keep_tex: yes в YAML, вы можете получить подсказку о том, что пошло не так. Начиная с subsubsection{Codebook} , вы увидите

 subsubsection{Codebook}

settowidth{cbl}{code}
    parskip 1em plus .3em minus .2em
    parindent 0pt
    defcode#code#
  

Итак, что произошло, так это то, что Pandoc попытался обработать
ваше определение среды вместо того, чтобы оставить его в покое. Вы можете заставить его игнорировать определение, введя его следующим образом:

 ```{=latex}
newlengthcbl
newenvironment{codebook}[1][rob_avprison1]{
    settowidth{cbl}{#1}
    parskip1em plus .3em minus .2em
    parindent0pt
    defcode##1##2{{bfseries ##1}hfill
        parbox[t]{dimexprlinewidth-15em-cbl}{##2}par}}{noindent}
```
  

Кажется, этого достаточно в вашем минимальном примере, но вам может потребоваться добавить больше материала в реальный документ.

Комментарии:

1. Спасибо! Это сработало для минимального примера и полного документа. Очень признателен.