为 Sphinx 容器分配参数

问题描述 投票:0回答:2

我在

preamble
conf.py
中声明一个自定义环境,它需要 6 个参数

% REQUIREMENT STYLE/FORMAT
\newenvironment{sphinxclasscustomizedrequirement}[6]{
    \rule{15cm}{1pt}\\ 
    \fontfamily{qcr}\selectfont
    \color{red}
    ARG1 = #1\\[1ex]
    \color{black}
    ARG2 = #2\\[1ex]
    ARG3 = #3\\[1ex]
    ARG4 = #4\\[1ex]
    ARG5 = #5\\[1ex]
    \rule{15cm}{1pt}\\
}{}

我使用

container
指令将一些块包装到这个环境中

.. container:: customizedrequirement
    
    HELLO WORLD THIS IS A TEST

但是,我不知道如何指定这个环境的 6 个参数。

我想生成这个 LaTeX 代码

\begin{sphinxuseclass}{customizedrequirement}{123456}{LOREM}{IPSUM}{DOLOR}{SIT}
\sphinxAtStartPar
HELLO WORLD THIS IS A TEST
\end{sphinxuseclass}

但我不知道如何在

rst
中做到这一点。

如果我像

code-block

中那样指定参数
.. container:: customizedrequirement
    :a: A
    :b: B
    :c: C
    :d: DEBUG
    
    HELLO WORLD THIS IS A TEST

然后它生成这个

\begin{sphinxuseclass}{customizedrequirement}
\begin{sphinxuseclass}{a}
\begin{sphinxuseclass}{a}
\begin{sphinxuseclass}{b}
\begin{sphinxuseclass}{b}
\begin{sphinxuseclass}{c}
\begin{sphinxuseclass}{c}
\begin{sphinxuseclass}{d}
\begin{sphinxuseclass}{debug}
\sphinxAtStartPar
HELLO WORLD THIS IS A TEST

\end{sphinxuseclass}
\end{sphinxuseclass}
\end{sphinxuseclass}
\end{sphinxuseclass}
\end{sphinxuseclass}
\end{sphinxuseclass}
\end{sphinxuseclass}
\end{sphinxuseclass}
\end{sphinxuseclass}

如何使用指定参数生成对我的环境的调用?

latex python-sphinx
2个回答
0
投票

我最终做的是编写一个自定义扩展,因为如果没有扩展,我无法让它开箱即用。

class Requirement(Directive):

    has_content = True

    option_spec = {
        'id': directives.unchanged_required,
        'source': directives.unchanged,
        'allocation': directives.unchanged_required,
        'safety': directives.unchanged_required,
    }


    def run(self):
        paragraph_node = nodes.paragraph()
        self.state.nested_parse(self.content, self.content_offset, paragraph_node)

        req_id = self.options.get('id', 'undefined')
        source = self.options.get('source', 'None (derived requirement)')
        allocation = self.options.get('allocation', 'undefined')
        safety = self.options.get('safety', 'undefined')       
        arguments = f'{{{req_id}}}{{{source}}}{{{allocation}}}{{{safety}}}'.replace('_','\_')
        
        latex_prefix = nodes.raw('', '\\begin{customizedrequirement}' + arguments, format='latex')
        latex_suffix = nodes.raw('', '\end{customizedrequirement}', format='latex')
        return [latex_prefix, paragraph_node, latex_suffix]

def setup(app):
    app.add_directive("requirement", Requirement)

    return {
        'version': '0.1',
        'parallel_read_safe': True,
        'parallel_write_safe': True,
    }

这是我在

.rst

中调用分机的方式
.. requirement::
    :id: ABCDE
    :source: req_1
    :allocation: team1
    :safety: high

    This is the textual content

最后,它生成了我想要的 LaTeX :

\begin{customizedrequirement}{ABCDE}{req_1}{team1}{high}
\sphinxAtStartPar
\sphinxAtStartPar
This is the textual content


\end{customizedrequirement}

别忘了向您的

customizedrequirement
声明样式
preamble
:

latex_elements = {
  'preamble': r'''
% REQUIREMENT STYLE/FORMAT
\newenvironment{customizedrequirement}[5]{
    \rule{15cm}{1pt}\\ 
    \small
    \color{red}
    #1\\[1ex]
    \color{black}
    SOURCE=#2\\[1ex]
    ALLOCATION=#3\\[1ex]
    SAFETY=#4\\[1ex]
}{
\rule{15cm}{1pt}\\
}
'''
}

-1
投票

你成功做到了吗?我也有同样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.