Como escrever este pseudocódigo onde condição

Como escrever este pseudocódigo onde condição

Esta questão é uma extensão desta questão sobrelistando perguntas de diretórios. Tenho um problema que preciso entender a seção original do texto.

Saída atual

insira a descrição da imagem aqui

onde você vê a segunda pergunta não faz sentido. Foi incluído nosubsection Arterite de Takayasuno diretório Reumatologia:

\subsection{Takayasu arteritis}

\begin{question}
{You get a patient. 
What do you notice first in this patient?}
Absence of peripheral pulse.
\end{question}

Lorem ipsum.    

\begin{question}
{What was the first Takayasu case?}
Young woman in Asia with red vessels in the eye. 
So special eye diagnosis done. 
Affects eye.
\end{question}

onde a saída atual é por este excelentecódigo

\section{Rheumatology}  

\begin{question}
{You get a patient. 
What do you notice first in this patient?}
Absence of peripheral pulse.
\end{question}

\begin{question}
{What was the first Takayasu case?}
Young woman in Asia with red vessels in the eye. 
So special eye diagnosis done. 
Affects eye.
\end{question}

mas eu gostaria que fosse

\section{Rheumatology}  

\subsection{Takayasu arteritis}

\begin{question}
{You get a patient. 
What do you notice first in this patient?}
Absence of peripheral pulse.
\end{question}

\begin{question}
{What was the first Takayasu case?}
Young woman in Asia with red vessels in the eye. 
So special eye diagnosis done. 
Affects eye.
\end{question}

Minha proposta é incluir subseções se houver dúvidas dentro da subseção.

Meu pseudocódigo

Look for the environment \begin{question}...\end{question}.
See the subsection of the question (it locates above the question). 
   If there is no subsection, leave blank. 
   If there are many questions within one subsection, put only one subsection. 

Código de Terdon

#!/usr/bin/env bash

## avoid errors if a directory has no *tex files
shopt -s nullglob

directories=("Cardiology" "Rheumatology" "Surgery");

## Change this to set whichever options you want.
printf "%s\n%s\n" "\documentclass{YOURCLASS}" "\begin{document}"

for directory in ${directories[@]}
do
    ## Reset the counter, avoid empty sections.
    c=0;
    for file in "$directory"/*tex
    do
        let c++
        [ "$c" -eq 1 ] && printf "\n%s\n" "\section{$directory}"
        ## Extract the wanted lines
        perl -lne '$a=1 && print "" if /\\begin{question}/; 
                  print if $a==1;
                  $a=0 if /\\end{question}/;' "$file" 
        echo ""
    done
done
echo "\end{document}"

onde acho que a lógica dessas linhas deveria ser mudada

        ## Extract the wanted lines
        perl -lne '$a=1 && print "" if /\\begin{question}/; 
                  print if $a==1;
                  $a=0 if /\\end{question}/;' "$file" 
        echo ""

que usa um regex para encontrar todas as perguntas em um arquivo E ignora as subseções das perguntas.

Exemplo de dados(um pouco diferente do último caso!)

\subsection{Takayasu arteritis}

\begin{question}
{You get a patient. 
What do you notice first in this patient?}
Absence of peripheral pulse.
\end{question}

\begin{question}
{What was the first Takayasu case?}
Young woman in Asia with red vessels in the eye. 
So special eye diagnosis done. 
Affects eye.
\end{question}


Fever of unknown origin can be used when you do not know what is causing the disease. 

% Show cases in MedScape and ask class. 

Aneurysms. 


\subsubsection{Treatment}

\begin{question}
{What you should always include in Takayasu treatment? 
What are the symptoms?}
Blood pressure.
Aneurysms which will burst without treatment. 
So blood pressure decreasing drugs like beta blockers along in combination with other drugs.
\end{question}

\begin{question}
{When is the checkup of the Takayasu arteritis?} 
Only once per year. 
You could expect every month like normally in this kind of diseases.
But only once per year.
\end{question}

onde você pode ignorar subseções no aplicativo.

Como você pode escrever o pseudocódigo?


Bug no código do Terdon 14.10.2014 encontrado

Exemplo de dados que causam o bug

\subsection{3}
A 55 y.o male says that for the last year ... 

\begin{question}
{What is the pathogenetic mechanism of his complains?} 
\end{question}

que analisado pelo código de Terdon dá exatamente o mesmo resultado que está errado, uma vez que a fraseUm 55 anos..não deveria mais estar lá no resultado final. Se houver uma entrada entre a subseção e o corpo do texto, corrija a saída. No entanto, isso não pode ser assumido.

A causa deste bug são os símbolos do Windows, movidosaqui.

Responder1

Eu ia estender meu código original, mas está chegando a um ponto em que é muito mais fácil reimplementar tudo diretamente em Perl:

#!/usr/bin/env perl

## This is the path to the target  directories
my $path="/Users/Masi/Dropbox/";

## The target directories
my @directories=("Cardiology","Rheumatology","Surgery");

## Iterate over the directories
foreach my $dir (@directories) {
    my $dd=0;
    ## Read the current directory
    opendir (my $DIR, "$path/$dir");
    ## Find all files in this directory
    while (my $file = readdir($DIR)) {
        ## Reset the counter
        my $c=0;
        ## Skip any files that aren't .tex
        next unless $file =~ /\.tex$/;

        ## Open the file
        open(my $fh,"$path/$dir/$file");

        while (<$fh>) {
            ## Get the subsection. $_ is the current line.
            $sub="$_" and $n=0 if /\\subsection{/;
            ## If this line is a question
            if (/\\begin{question}/) {
                ## If this counter is 0, this is the first file
                ## of this directory, so print the section
                ## Print the section name
                if ($dd==0) {
                    print "\\section{$dir}\n\n";
                    $dd++;
                } 
                ## If this counter is 0, this is the first question
                ## of this subsection, so print the subsection line
                print "$sub\n" if $n==0;

                $n++;
                ## Increment the counter, we want these lines
                $c++;
                ## And print
                print;
            }
            else {
                ## Print lines if the counter is 1
                print if $c==1;
                ## reset the counter to 0
                print "\n" and $c=0 if /\\end{question}/;
            }
        }
        print "\n";
    }

}

Observe que isso ignora as subseções, mas seria fácil modificá-lo para incluí-las.

Responder2

Extensão ou melhoria do código de Terdoncom base em alguma lógica nesteresponder

#!/usr/bin/env perl

## This is the path to the target  directories
my $path="/Users/Masi/Dropbox/";
chdir $path or die "cannot chdir '$path'";

## Iterate over the directories
foreach my $dir (
    "Cardiology", "Pathophysiology", "Patology and Biopsy", "Physiology",
    "Propedeutics", "Radiology", "Rheumatology", "Surgery"
)
{
    my $dd=0;
    ## Read the current directory
    opendir my $DIR, $dir or die "cannot opendir '$dir'";

    ## Find all files in this directory
    while (my $file = readdir($DIR)) {
        ## Reset the counter
        my $c=0;
        ## Skip any files that aren't .tex
        next unless $file =~ /\.tex$/;

        ## Open the file
        open(my $fh,"$path/$dir/$file");

        while (<$fh>) {
            ## Get the subsection. $_ is the current line.
            $sub="$_" and $n=0 if /\\subsection{/;
            ## If this line is a question
            if (/\\begin{question}/) {
                ## If this counter is 0, this is the first file
                ## of this directory, so print the section
                ## Print the section name
                if ($dd==0) {
                    print "\\section{$dir}\n\n";
                    $dd++;
                }
                ## If this counter is 0, this is the first question
                ## of this subsection, so print the subsection line
                print "$sub\n" if $n==0;

                $n++;
                ## Increment the counter, we want these lines
                $c++;
                ## And print
                print;
            }
            else {
                ## Print lines if the counter is 1
                print if $c==1;
                ## reset the counter to 0
                print "\n" and $c=0 if /\\end{question}/;
            }
        }
        print "\n";
    }
    closedir $DIR  or die "cannot closedir '$dir'";
}

onde adicionei algum gerenciamento de erros.

informação relacionada